题目大意

  有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮

  有的灯在开关关的时候亮,【每个开关最多对应两盏灯】,试找出一种开关的ON,OFF状态,使得所有灯都亮。

  (注意不要漏读黑框内的内容)

解法1:网络流

  对于一个开关有一下几种情况:

  1.开关只连向一个灯,直接设定开关点亮此灯。

  2.开关连向两个开关状态需求相同的灯,直接把开关拨到相应状态,点亮两个灯。

  3.开关连向两个需求不同冲突的灯,(只能选择两者之一点亮)。

  接下来网络流即可【注意区分n,m】

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <vector>
  5 #include <queue>
  6
  7 #define N 1010
  8 #define INF 0x3f3f3f3f
  9 #define p E[i].x
 10
 11 using namespace std;
 12
 13 int n,m,S,T,totE;
 14 int sw[N],g[N],d[N];
 15 bool v[N];
 16 vector<int> a[2][N];
 17 queue<int> q;
 18
 19 struct edge
 20 {
 21     int x,to,cap;
 22 }E[200010];
 23
 24 void addedge(int x,int y,int cap)
 25 {
 26     E[++totE] = (edge){y,g[x],cap}; g[x]=totE;
 27     E[++totE] = (edge){x,g[y],0};    g[y]=totE;
 28 }
 29
 30 bool bfs()
 31 {
 32     memset(v,0,sizeof(v));
 33     d[S]=1;
 34     v[S]=1;
 35     q.push(S);
 36     while(!q.empty())
 37     {
 38         int x=q.front(); q.pop();
 39         for(int i=g[x];i;i=E[i].to)
 40             if(E[i].cap && !v[p])
 41             {
 42                 v[p]=1;
 43                 d[p]=d[x]+1;
 44                 q.push(p);
 45             }
 46     }
 47     return v[T];
 48 }
 49
 50 int dinic(int x,int flow)
 51 {
 52     if(x==T || !flow) return flow;
 53     int f=0;
 54     for(int i=g[x];i&&flow;i=E[i].to)
 55         if(d[p]==d[x]+1&&E[i].cap)
 56         {
 57             int tmp=dinic(p,min(flow,E[i].cap));
 58             f+=tmp;
 59             flow-=tmp;
 60             E[i].cap-=tmp;
 61             E[i^1].cap+=tmp;
 62         }
 63     if(!f) d[x]=-1;
 64     return f;
 65 }
 66
 67 int main()
 68 {
 69 //    freopen("test.txt","r",stdin);
 70     while(~scanf("%d%d",&n,&m))
 71     {
 72         memset(g,0,sizeof(g));
 73         totE=1;
 74         for(int i=1;i<=m;i++)
 75         {
 76             sw[i]=0;
 77             a[0][i].clear();
 78             a[1][i].clear();
 79         }
 80         char cmd[11];
 81         for(int i=1,x,K;i<=n;i++)
 82         {
 83             scanf("%d",&K);
 84             while(K--)
 85             {
 86                 scanf("%d%s",&x,cmd);
 87                 int tmp;
 88                 if(cmd[1]=='N') tmp=1;
 89                 else tmp=0;
 90                 a[tmp][x].push_back(i);
 91             }
 92         }
 93         S=0;
 94         T=n+m+1;
 95         for(int i=1;i<=n;i++) addedge(i+m,T,1);
 96         for(int i=1;i<=m;i++)
 97         {
 98             if(a[0][i].size()==1 && a[1][i].size()==1)
 99             {
100                 addedge(S,i,1);
101                 sw[i]=-1;
102                 addedge(i,m+a[0][i][0],1);
103                 addedge(i,m+a[1][i][0],1);
104             }
105             else if(a[0][i].size()==2)
106             {
107                 addedge(S,i,2);
108                 sw[i]=0;
109                 addedge(i,m+a[0][i][0],1);
110                 addedge(i,m+a[0][i][1],1);
111             }
112             else if(a[1][i].size()==2)
113             {
114                 addedge(S,i,2);
115                 sw[i]=1;
116                 addedge(i,m+a[1][i][0],1);
117                 addedge(i,m+a[1][i][1],1);
118             }
119             else
120             {
121                 addedge(S,i,1);
122                 if(a[1][i].size())         sw[i]=1, addedge(i,m+a[1][i][0],1);
123                 else if(a[0][i].size()) sw[i]=0, addedge(i,m+a[0][i][0],1);
124                 else sw[i]=0;
125             }
126         }
127         int ans=0;
128         while(bfs()) ans+=dinic(S,INF);
129         if(ans<n) puts("-1");
130         else
131         {
132             for(int i=2;i<=totE;i+=2)
133             {
134                 if(E[i].cap) continue;
135                 int x=E[i^1].x, y=E[i].x;
136                 if(sw[x]!=-1) continue;
137                 //cout << x << ' ' << y-m<<endl;
138                 if(x<=m && x>=1)
139                 {
140                     if(y-m == a[0][x][0]) sw[x]=0;
141                     else sw[x]=1;
142                 }
143             }
144             for(int i=1;i<=m;i++)
145             {
146                 if(sw[i]) printf("ON%c",i==m? '\n':' ');
147                 else printf("OFF%c",i==m? '\n':' ');
148             }
149         }
150     }
151     return 0;
152 }

View Code

解法2:DLX

转载于:https://www.cnblogs.com/lawyer/p/6353909.html

HDU - 2828 网络流相关推荐

  1. HDU 3338 网络流 建图

    原题位置http://acm.hdu.edu.cn/showproblem.php?pid=3338 这道题的意思就是 给你一个由黑白方格构成的图 白方格全部空着 黑方格有的会有数字 在左下角的数字表 ...

  2. Food HDU - 4292 网络流

    题意: 有n个人,f种食物和d种饮料,每种饮料和食物的个数已知,假设一个人拿到一个自己喜欢的食物或饮料,那个人就会感到满足. 最多能有几个人满足? 思路:拆点建图. 一个人必须又要饮料又要食物,假设我 ...

  3. [DLX反复覆盖] hdu 2828 Lamp

    题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...

  4. DancingLinks刷题集

    HDU 3663 Power Stations 精确覆盖 题意:每个城市i有xi->yi天可以成为发射站,发射站覆盖范围为与该站有一条边链接的城市. 同时,每个每天城市必须且只能被一个发射站覆盖 ...

  5. 2012成都网络赛赛后【缺CHJ】

    A Coder (HDU 4288,与Codeforces 85D相同) 应该用线段树写,我是块状链表水过了 #include<map>#include<cstdio>#inc ...

  6. oracle客户端没有tnsnames,安装好Oracle Client以后没有tnsnames.ora文件

    安装好Oracle Client以后没有tnsnames.ora文件 安装完Oracle Client以后,发现相应目录中没有tnsnames.ora文件,其实只要手动建立一个就可以了. 在 orac ...

  7. hdu 3572 Task Schedule 网络流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 Our geometry princess XMM has stoped her study i ...

  8. hdu 2883 kebab 网络流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2883 Almost everyone likes kebabs nowadays (Here a ke ...

  9. HDU 3046Pleasant sheep and big big wolf(切最小网络流)

    职务地址:HDU 3046 最小割第一发!事实上也没什么发不发的. ..最小割==最大流.. 入门题,可是第一次入手最小割连入门题都全然没思路... sad..对最小割的本质还是了解的不太清楚.. 这 ...

最新文章

  1. 【ACM】杭电OJ 1096
  2. SpringBoot注入数据的方式
  3. 构建Koa2 + Vue2.0 前后端分离的多页应用
  4. (转) 服务接口统一返回的格式
  5. python散点图拟合曲线-python散点图拟合
  6. 为什么on用的时候会失效?
  7. 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法
  8. 斯坦福大学博士后王鸿伟: 知识图谱辅助的个性化推荐系统
  9. java查找目录文件函数_java 实现 文件操作工具集。包括文件、目录树的拷贝、删除、移动、查找等工具函数...
  10. Python爬虫入门之使用Redis+Flask维护动态代理池
  11. php html转ubb,php实现转换ubb代码的方法
  12. WPF调用 ECharts 显示图表
  13. 恩智浦智能车一些常见的问题
  14. Sql Server Express版本升级到企业版
  15. html 页面怎么打印很小,网页上的内容打印出来太小怎么处理
  16. iphone11支持es6吗_我这样用拼多多砍价群,拿到了不要钱的iPhone11
  17. python爬虫之使用urllib模块实现有道翻译功能
  18. 高老师的架构设计_隽语集(AA_0151)
  19. iOS Apple Pay(银联渠道) 、云闪付
  20. 【毕业设计/Matlab系列】基于PCM编译码和2ASK调制解调的通信系统仿真

热门文章

  1. linux cat 重定向,Linux命令(cp mv cat和重定向)(示例代码)
  2. Flink 合流水位线图解
  3. Java JavaBean
  4. 数据传输服务 DTS > 数据迁移 > 从自建数据库迁移至阿里云 > 源库为MySQL > 从自建MySQL迁移至RDS MySQL
  5. 敏捷开发系列学习总结(14)——Spotify敏捷模式详解三部曲第二篇:研发过程
  6. Java Web学习总结(34)——拦截器和过滤器的差异总结
  7. python安装库pandas_安装python的第三方库 geopandas
  8. Gradle 3.0.0设置Apk文件输出命名
  9. DIY JavaAPI CHM文档
  10. 面向对象设计的六大原则简介