【题目链接】:http://codeforces.com/contest/776/problem/D

【题意】



每个门严格由两个开关控制;

按一下开关,这个开关所控制的门都会改变状态;

问你能不能使所有的门都打开(同时);

【题解】

/*
对于每个门,
有两个开关连接着它;
用一条边连接这两个开关
则如果这个门的状态是关的,
则这条边的边权为1
表示它们俩的颜色不能一样;
(也即这两个开关只能改变一个)
也即要1开1关;
如果这个门的状态是开的
则这条边的边权为0;
表示它们俩的颜色相同;
即同时开或同时关.
然后做一个二分图染色
可以就是YES否则NO
也就是说把开关看成节点,门看成边,根据边来确定这条边的两端的节点的颜色是一样还是不同;
*/

【完整代码】

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#define rei(x) cin >> x
#define rep1(i,x,y) for (int i = x;i <= y;i++)
using namespace std; const int N = 2e5 + 100; int n, m, a[N],color[N];
vector <int> g1[N],g[N],w[N]; void dfs(int x, int c)
{
color[x] = c;
int len = g[x].size();
rep1(i, 0, len - 1)
{
int y = g[x][i];
int ju = w[x][i];
if (color[y] != 0)
{
if (ju == 1 && color[y] == color[x])
{
puts("NO");
exit(0);
}
if (ju == 0 && color[y] != color[x])
{
puts("NO");
exit(0);
}
}
else
if (ju == 0)
dfs(y, c);
else
dfs(y, 3 - c);
}
} int main()
{
//freopen("D:\\rush.txt", "r", stdin);
rei(n),rei(m);
rep1(i, 1, n)
rei(a[i]);
rep1(i, 1, m)
{
int num;
rei(num);
rep1(j, 1, num)
{
int x;
cin >> x;
g1[x].push_back(n + i);
g1[n + i].push_back(x);
}
}
rep1(i, 1, n)
{
int y1 = g1[i][0], y2 = g1[i][1];
int bian = 1 - a[i];
g[y1].push_back(y2), g[y2].push_back(y1);
w[y1].push_back(bian),w[y2].push_back(bian);
}
rep1(i,n+1,n+m)
if (color[i] == 0)
dfs(i, 1);
puts("YES");
return 0;
}

最新文章

  1. 【流程管理】【PCB】PCB设计流程
  2. 通过其他页面跳转到tableBar指示的界面
  3. Linux rpmbuild命令
  4. ES6入门系列一(基础)
  5. 获取AVCaptureSession samplebuffer 一像素的 rgb值
  6. 学习练习 java输入输出流 练习题1
  7. 验证中文、英文、电话、手机、邮箱、数字、数字和字母、Url地址和Ip地址的正则表达式
  8. [Winfrom] 捕获窗体最大化、最小化和关闭按钮的事件
  9. DOM重绘对focus的影响
  10. C#学习基础总结
  11. pyparsing:定制自己的解析器
  12. Zabbix实战-简易教程(3)--DB安装和表分区
  13. CSS简写总结
  14. VUE-010-通过声明式导航 router-link 传递 params 参数(路由 name 识别,请求链接不显示参数传递)
  15. GetCheckProxy
  16. 安装sqlserver后 服务启动过几秒就自动停止
  17. javascript 面向过程和面向对象
  18. Generator函数执行器-co函数库源码解析
  19. java execute、executeQuery和executeUpdate之间的区别
  20. 解决android有的手机拍照后上传图片被旋转的问题

热门文章

  1. Vue 使用use、prototype自定义自己的全局组件
  2. FansMail:邮件发送标准API与技术实现(Java)
  3. PythonOOP面向对象编程2
  4. js面向对象的选项卡
  5. vuex概念总结及简单使用实例
  6. 10.1、android输入系统_必备Linux编程知识_inotify和epoll
  7. ITFriend月刊-第1期-2014年6月.pdf
  8. Debian 上创建新的用户
  9. 用Java将字符串的首字母转换大小写
  10. javascript 调用C++函数