HDU - 2828 网络流
题目大意
有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮
有的灯在开关关的时候亮,【每个开关最多对应两盏灯】,试找出一种开关的ON,OFF状态,使得所有灯都亮。
(注意不要漏读黑框内的内容)
解法1:网络流
对于一个开关有一下几种情况:
1.开关只连向一个灯,直接设定开关点亮此灯。
2.开关连向两个开关状态需求相同的灯,直接把开关拨到相应状态,点亮两个灯。
3.开关连向两个需求不同冲突的灯,(只能选择两者之一点亮)。
接下来网络流即可【注意区分n,m】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue> #define N 1010
#define INF 0x3f3f3f3f
#define p E[i].x using namespace std; int n,m,S,T,totE;
int sw[N],g[N],d[N];
bool v[N];
vector<int> a[][N];
queue<int> q; struct edge
{
int x,to,cap;
}E[]; void addedge(int x,int y,int cap)
{
E[++totE] = (edge){y,g[x],cap}; g[x]=totE;
E[++totE] = (edge){x,g[y],}; g[y]=totE;
} bool bfs()
{
memset(v,,sizeof(v));
d[S]=;
v[S]=;
q.push(S);
while(!q.empty())
{
int x=q.front(); q.pop();
for(int i=g[x];i;i=E[i].to)
if(E[i].cap && !v[p])
{
v[p]=;
d[p]=d[x]+;
q.push(p);
}
}
return v[T];
} int dinic(int x,int flow)
{
if(x==T || !flow) return flow;
int f=;
for(int i=g[x];i&&flow;i=E[i].to)
if(d[p]==d[x]+&&E[i].cap)
{
int tmp=dinic(p,min(flow,E[i].cap));
f+=tmp;
flow-=tmp;
E[i].cap-=tmp;
E[i^].cap+=tmp;
}
if(!f) d[x]=-;
return f;
} int main()
{
// freopen("test.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
memset(g,,sizeof(g));
totE=;
for(int i=;i<=m;i++)
{
sw[i]=;
a[][i].clear();
a[][i].clear();
}
char cmd[];
for(int i=,x,K;i<=n;i++)
{
scanf("%d",&K);
while(K--)
{
scanf("%d%s",&x,cmd);
int tmp;
if(cmd[]=='N') tmp=;
else tmp=;
a[tmp][x].push_back(i);
}
}
S=;
T=n+m+;
for(int i=;i<=n;i++) addedge(i+m,T,);
for(int i=;i<=m;i++)
{
if(a[][i].size()== && a[][i].size()==)
{
addedge(S,i,);
sw[i]=-;
addedge(i,m+a[][i][],);
addedge(i,m+a[][i][],);
}
else if(a[][i].size()==)
{
addedge(S,i,);
sw[i]=;
addedge(i,m+a[][i][],);
addedge(i,m+a[][i][],);
}
else if(a[][i].size()==)
{
addedge(S,i,);
sw[i]=;
addedge(i,m+a[][i][],);
addedge(i,m+a[][i][],);
}
else
{
addedge(S,i,);
if(a[][i].size()) sw[i]=, addedge(i,m+a[][i][],);
else if(a[][i].size()) sw[i]=, addedge(i,m+a[][i][],);
else sw[i]=;
}
}
int ans=;
while(bfs()) ans+=dinic(S,INF);
if(ans<n) puts("-1");
else
{
for(int i=;i<=totE;i+=)
{
if(E[i].cap) continue;
int x=E[i^].x, y=E[i].x;
if(sw[x]!=-) continue;
//cout << x << ' ' << y-m<<endl;
if(x<=m && x>=)
{
if(y-m == a[][x][]) sw[x]=;
else sw[x]=;
}
}
for(int i=;i<=m;i++)
{
if(sw[i]) printf("ON%c",i==m? '\n':' ');
else printf("OFF%c",i==m? '\n':' ');
}
}
}
return ;
}
解法2:DLX
HDU - 2828 网络流的更多相关文章
- 【解题报告】 Leapin' Lizards HDU 2732 网络流
[解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...
- HDU 2828 Lamp 二分图的最大匹配 模型题
http://acm.hdu.edu.cn/showproblem.php?pid=2828 给定n个灯,m个开关,使得每栈灯亮,前提是控制这栈灯的开关的状态是其中一个.(题目应该都看得懂) 其实我想 ...
- HDU 1083 网络流之二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...
- HDU 4888 (网络流)
Poroblem Redraw Beautiful Drawings (HDU4888) 题目大意 一个n行m列的矩形,只能填0~k的数字. 给定各行各列的数字和,判定有无合法的方案数.一解给出方案, ...
- hdu 4280 网络流
裸的网络流,递归的dinic会爆栈,在第一行加一句就行了 #pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...
- HDU 4292Food(网络流的最大流量)
职务地址:HDU 4292 水题. 因为每一个人仅仅能有1份,所以须要拆点限制流量.建图方法为,建一源点与汇点.将食物与源点相连,权值为食物额数量,将饮料与汇点相连,权值为饮料数量..然后将人进行拆点 ...
- Food HDU - 4292 网络流 拆点建图
http://acm.hdu.edu.cn/showproblem.php?pid=4292 给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料 写的时候一共用了2种 ...
- hdu 1565&hdu 1569(网络流--最小点权值覆盖)
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 6634 网络流最小割模型 启发式合并
如果我们先手拿完所有苹果再去考虑花费的话. S -> 摄像头 -> 苹果 -> T 就相当于找到一个最小割使得S和T分开. ans = sum - flow. 然后对于这一个模型, ...
随机推荐
- 【Spring boot】【gradle】idea新建spring boot+gradle项目
在此之前,安装了idea/jdk/gradle在本地 ===================================== gradle怎么安装:http://www.cnblogs.com/s ...
- VMware Workstation 虚拟机设置连接U盘
首先确保主机有开启"VMware USB Arbitration Service"服务,而且在执行中. 如图:(我的系统是win8.1 ) 在VMware Workstation虚 ...
- SpringCloud中Redis的使用
1.引入redis相关jar包 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- 转:linux下共享库的注意点之-fpic
转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...
- Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜
上一章完毕了对图片的磨皮处理.经过简单算法流程优化,能够达到非常快的速度.可是不能用于实时美颜.经实验,若採用仅仅处理Y信号的方案.半径极限大约是5-10,超过10则明显感受到卡顿.但对于1920X1 ...
- cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法
cocos2d-x 3.0 中.假设你须要使用CocosStudio.Extensions扩展库 等等.都须要自己手动加入. 加入过程例如以下:(比方说如今我要加入libExtensions,libC ...
- java之static变量与全局、局部变量的区别
static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无 ...
- 李洪强iOS开发之-入门指南
李洪强iOS开发之-入门指南 1零基础小白如何进行iOS系统学习 首先,学习目标要明确:其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走:再次,学技术最重 ...
- mysql关闭skip-grant-tables快速重置mysql密码
如果你忘记了mysql密码几乎是没有什么好办法可以直接修改密码了,但我们可以在my.ini把加上skip-grant-tables,然后重启mysql就不需要密码了,这时我们再修改root密码,最后再 ...
- Arcgis Engine(ae)接口详解(7):地图(map)操作
IMap map = null; //跟map同一层次的activeView对象,他们都是“地图”的对象,map管理地图内容,activeView管理显示内容 IActiveView activeVi ...