http://codeforces.com/problemset/problem/776/D

题意:有n个门,m个开关,每个门有一个当前的状态(0表示关闭,1表示打开),每个开关控制k个门,但是每个门确切的受两个开关控制,如果一个开关打开,那么原来关闭的门会打开,打开的门关闭,问是否存在一个情况使得所有的门打开。

思路:类似于01染色,把开关当成点,门当前的状态当成边权建图。初始先假设一个门的状态(初始假设为0和假设为1都是一样的,举几个例子就发现了),然后因为每个门受两个开关控制,所以可以推出下一个门的状态,如果发现互斥的情况,那么就是“NO”。

这里设成门状态0表示打开,1表示关闭,方便运算。

 #include <bits/stdc++.h>
using namespace std;
#define N 200010
struct Edge {
int v, nxt, w;
} edge[N*];
int col[N], fir[N], sec[N], head[N], tot, w[N]; void Add(int u, int v, int w) {
edge[tot] = (Edge) {v, head[u], w}; head[u] = tot++;
edge[tot] = (Edge) {u, head[v], w}; head[v] = tot++;
} bool dfs(int u) {
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v, w = edge[i].w;
if(col[v] == -) { // 如果这个开关没染色
col[v] = col[u] ^ w;
if(!dfs(v)) return false;
} else if(col[u] ^ col[v] ^ w) return false; // 如果染过色并发生矛盾
}
return true;
} int main() {
int n, m;
cin >> n >> m;
for(int i = ; i <= n; i++) scanf("%d", &w[i]), w[i] ^= ;
for(int i = ; i <= m; i++) {
int k; scanf("%d", &k);
while(k--) {
int a; scanf("%d", &a);
if(fir[a] == ) fir[a] = i; // 连a点的第一个开关
else sec[a] = i; // 连a点的第二个开关
}
}
memset(head, -, sizeof(head)); tot = ;
for(int i = ; i <= n; i++)
Add(fir[i], sec[i], w[i]);
memset(col, -, sizeof(col));
bool flag = ;
for(int i = ; i <= m; i++) {
if(col[i] == -) {
col[i] = ; // 假设这个开关一开始是关的
if(!dfs(i)) { flag = ; break; }
}
}
if(!flag) puts("NO");
else puts("YES");
return ;
}

Codeforces 776D:The Door Problem(DFS染色)的更多相关文章

  1. Codeforces 776D The Door Problem

    题目链接:http://codeforces.com/contest/776/problem/D 把每一个钥匙拆成两个点${x,x+m}$,分别表示选不选这把钥匙. 我们知道一扇门一定对应了两把钥匙. ...

  2. Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)

    题目链接:http://codeforces.com/contest/742/problem/E 题意: 有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜. 现在让你输出一种方案,满足以下要求 ...

  3. 【codeforces 776D】The Door Problem

    [题目链接]:http://codeforces.com/contest/776/problem/D [题意] 每个门严格由两个开关控制; 按一下开关,这个开关所控制的门都会改变状态; 问你能不能使所 ...

  4. Codeforces 781A:Andryusha and Colored Balloons(DFS染色)

    http://codeforces.com/contest/782/problem/C 题意:给一棵树染最少的颜色,使得相邻距离为2的点都是不同的颜色,问最少是多少种颜色并输出每个点的颜色. 思路:比 ...

  5. Codeforces Gym100502A:Amanda Lounges(DFS染色)

    http://codeforces.com/gym/100502/attachments 题意:有n个地点,m条边,每条边有一个边权,0代表两个顶点都染成白色,2代表两个顶点都染成黑色,1代表两个顶点 ...

  6. Codeforces 1144F Graph Without Long Directed Paths DFS染色

    题意: 输入一张有向图,无自回路和重边,判断能否将它变为有向图,使得图中任意一条路径长度都小于2. 如果可以,按照输入的边的顺序输出构造的每条边的方向,构造的边与输入的方向一致就输出1,否则输出0. ...

  7. cf804C(dfs染色)

    题目链接: http://codeforces.com/problemset/problem/804/C 题意: 有一颗含有 n 个顶点的树, 第 i 个顶点上有 k 个冰激凌, 每个冰激凌的种类为 ...

  8. Codeforces 600 E. Lomsat gelral (dfs启发式合并map)

    题目链接:http://codeforces.com/contest/600/problem/E 给你一棵树,告诉你每个节点的颜色,问你以每个节点为根的子树中出现颜色次数最多的颜色编号和是多少. 最容 ...

  9. hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

    Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants ...

  10. hdu 4751 Divide Groups(dfs染色 或 2-sat)

    Problem Description   This year is the 60th anniversary of NJUST, and to make the celebration more c ...

随机推荐

  1. html5 页面元素插件

    1. 滚动条 jquery.nicescroll 正常引用方式: 设置区域高度 var bodyHeight = $(document.body).height(); $("#XXXXXXX ...

  2. Angular route传参

    从 router-link-page1 跳转 router-link-page2 和 router-link-page3 通过自定义路由 设置router-link-page2的路由后有3个参数,pa ...

  3. 工具:sql server profiler(分析器)

    打开profiler新建->连接数据库进行监测 任何访问该数据库的都有记录   image 对于linq的检验:sql实际如何->运行程序,查看分析器记录   image         ...

  4. NoSQL Manager for Cassandra 3.2.0.1 带Key

    NoSQL Manager for Cassandra 3.2.0.1 是一个Windows平台下Cassandra 数据库的高级管理工具.请低调使用. NoSQLManagerforCassandr ...

  5. 一步一步造个IoC轮子(二),详解泛型工厂

    一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):Ioc是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 详解泛型工厂 既然我说IoC容器 ...

  6. liunx 常用操作命令

    1.复制粘贴命令:在一行的任何位置按下yy,y是yanked拷贝的意思,然后去想粘贴的位置按下p即可.p是粘贴的意思. 2.如果想复制3行的话,按下3yy,就复制3行,如果想复制多行的话,直接按数字可 ...

  7. WPF ListboxItem 双击事件 Command绑定

    <ListBox x:Name="Lb" HorizontalAlignment="Left" Height="600" Vertic ...

  8. wpf VisualBrush 的使用,可创建重复图像

    VisualBrush 类(msdn) <Grid.Background> <VisualBrush TileMode="Tile" Viewport=" ...

  9. C#高性能大容量SOCKET并发(四):缓存设计

    原文:C#高性能大容量SOCKET并发(四):缓存设计 在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证.有很多服务程序是在启动时申请足够的内存 ...

  10. springboot 2.x处理404、500等异常

    404错误 404错误是不经过Controller的,所以使用@ControllerAdvice或@RestControllerAdvice无法获取到404错误 springboot2处理404错误的 ...