poj1087 A Plug for UNIX(网络流最大流)
http://poj.org/problem?id=1087
好久没遇见过这么坑的题了这个题真是挫的够可以的。题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的),
也有其对应型号;可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以将某一型号电源转换成另一型号的。问,你的用电器最少会有多少种无
法充电。也就是问可以用上电的用电器的最大数目,之后用电器总数减去此可用电最大数目即可得到最小不能用电数目。
一开始以为直接将插座,转换器,用电器匹配后跑个最大流模板就行,后来发现想的太简单了。
分析:
1:用电器可直接连插座;
2:用电器可以连接转换器再连接上插座;
3:转换器之间可以相互连接;
4:转换器转换作用是双向的,比如给定转换器可对A和B进行转换,则此转换器可以将A转换成B,也可以将B转换成A;
5:每种转换器的数目是无限的;
6:一个插座只能连接产生一个出处。
7:虚拟一个源点一个汇点即可,源点到插座和插头到汇点的流量为1。
按照这些建图失误了四次之后终于成功A过了。
附加详细建图步骤的备注的AC代码和一组测试数据(测试答案应当为0)
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- #include <queue>
- using namespace std;
- #define oo 0x3f3f3f3f
- int G[][], n, m, p, vis[];
- char receptacle[][];
- char plug[][];
- struct ad
- {
- char in[], out[];
- }adapter[];
- bool bfs(int Start, int End)
- {
- memset(vis, , sizeof(vis));
- vis[Start] = ;
- queue<int>Q;
- Q.push(Start);
- while(Q.size())
- {
- int now = Q.front();
- Q.pop();
- if(now == End)
- return true;
- for(int i=; i<=End; i++)
- {
- if(!vis[i] && G[now][i]>)
- {
- vis[i] = vis[now] + ;
- Q.push(i);
- }
- }
- }
- return false;
- }
- int dfs(int Start, int End, int Maxflow)
- {
- if(Start == End)
- return Maxflow;
- int nowflow = ;
- for(int i=; i<=End; i++)
- {
- if(vis[i] == vis[Start] + && G[Start][i]>)
- {
- int flow = min(G[Start][i], Maxflow - nowflow);
- flow = dfs(i, End, flow);
- G[Start][i] -= flow;
- G[i][Start] += flow;
- nowflow += flow;
- if(nowflow == Maxflow)
- break;
- }
- }
- return nowflow;
- }
- int dinic(int Start, int End)
- {
- int ans = , s;
- while(bfs(Start, End))
- {
- s = dfs(Start, End, oo);
- if(!s)break;
- ans += s;
- }
- return ans;
- }
- int main()
- {
- while(~scanf("%d", &n))
- {
- memset(G, , sizeof(G));
- for(int i=; i<=n; i++)
- scanf("%s", receptacle[i]);
- scanf("%d", &m);
- for(int i=; i<=m; i++)
- {
- scanf("%*s %s", plug[i]);
- for(int j=; j<=n; j++)
- {
- if(strcmp(receptacle[j], plug[i]) == )///插头和插座可直接连
- {
- G[j][n+p+i] = ;
- }
- }
- }
- scanf("%d", &p);
- for(int i=; i<=p; i++)
- scanf("%s %s", adapter[i].in, adapter[i].out);
- for(int i=; i<=p; i++)///1~n是插座,n+1~n+p是转换器,n+p+1~n+p+m是插头
- {
- for(int j=; j<=n; j++)
- {
- if(strcmp(receptacle[j], adapter[i].in)== || strcmp(receptacle[j], adapter[i].out)==)///插座和转换器匹配
- {
- G[j][n+i] = ;
- }
- }
- for(int j=; j<=m; j++)
- {
- if(strcmp(plug[j], adapter[i].out)== || strcmp(plug[j], adapter[i].in)==)///转换器和插头匹配
- {
- G[n+i][n+p+j] = ;
- }
- }
- }
- for(int i=; i<=p; i++)///转换器之间相连
- {
- for(int j=; j<=p; j++)
- {
- if(i!=j && strcmp(adapter[i].in, adapter[j].out)==)
- G[n+i][n+j] = oo;
- }
- for(int j=; j<=p; j++)
- {
- if(i!=j && strcmp(adapter[i].out, adapter[j].in)==)
- G[n+i][n+j] = oo;
- }
- }
- int Start = n+p+m+, End = Start+;
- for(int i=; i<=n; i++)///源点和插座相连
- {
- G[Start][i] = ;
- }
- for(int i=; i<=m; i++)///插头和汇点相连
- {
- G[n+p+i][End] = ;
- }
- printf("%d\n", m - dinic(Start, End));
- }
- return ;
- }
- /*
- 16
- A
- D
- X
- A
- D
- A
- D
- X
- D
- A
- D
- D
- X
- D
- X
- D
- 14
- CLOCK B
- CLOCK B
- CLOCK B
- LAPTOP B
- LAPTOP B
- LAPTOP B
- LAPTOP B
- LAPTOP B
- LAPTOP B
- PAGER B
- PAGER B
- COMB X
- CELL C
- CELL C
- 4
- C D
- X D
- B X
- B A
- */
poj1087 A Plug for UNIX(网络流最大流)的更多相关文章
- uva753 A Plug for UNIX 网络流最大流
C - A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of t ...
- poj 1087 C - A Plug for UNIX 网络流最大流
C - A Plug for UNIXTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...
- POJ1087 A Plug for UNIX 【最大流】
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13855 Accepted: 4635 ...
- UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)
解题报告 题意: n个插头m个设备k种转换器.求有多少设备无法插入. 思路: 定义源点和汇点,源点和设备相连,容量为1. 汇点和插头相连,容量也为1. 插头和设备相连,容量也为1. 可转换插头相连,容 ...
- 【uva753/poj1087/hdu1526-A Plug for UNIX】最大流
题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y.问最少有多少个插头被剩下. 题解: 最大流或者二分图匹配.然而我不知道怎么打二分图匹配..打了最大流.这题字符串比较坑 ...
- POJ1087 A Plug for UNIX(网络流)
在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们.你注意到有些设备使用没有插座的插头.你想知道这些设备是否来自建造这个房间时并不存在的国家.对于一些插座,有几个设备使用相应的插头.对于其他 ...
- POJ1087 A Plug for UNIX —— 最大流
题目链接:https://vjudge.net/problem/POJ-1087 A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K T ...
- POJ1087:A Plug for UNIX(最大流)
A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
- UVA 753 - A Plug for UNIX(网络流)
A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the U ...
随机推荐
- 【整理】动态加载Web Services
WebClient client = new WebClient(); String url = "http://localhost/MESAPIWebService/MESAPI.asmx ...
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...
- js prepend() 和append()区别
prepend() 方法在被选元素的开头(仍位于内部)插入指定内容.prepend() 语法:$(selector).prepend(content) 或 $(selector).prepend(fu ...
- 2016-11-10:win7下VMware虚拟机中CentOS6.5网络配置
在win7环境下,使用桥接和NAT模式配置VMware虚拟机网络,实现宿主机与虚拟机以及虚拟机通过宿主机网卡访问互联网. 1 配置VMware虚拟网络编辑器 VMnet0 桥接模式 VMnet1仅主机 ...
- 关于Hibernate XXX is not mapped 错误
我的实体类是这么配置的 @Entity(name="EntityName") //必须,name为可选,对应数据库中一的个表 就会出现 XXX is not mapped. ...
- php-fpm 在centos 7下的安装配置
安装php: sudo yum install php php-fpm php-mysql php-mbstring php-mcrypt php-sockets php-curl php-commo ...
- 登陆+注册(三层+sql语句)
啰嗦:今天面试,遇到这个上级测试,很容易的,因为一个错误,居然最后没做出来,心累 回到家,1小时做完,我特么还加了密,我还验证,可是上天不给我一次重来的机会啊 很垃圾的,小白可以看看,大神可以轻喷 首 ...
- Python发送邮件(支持中文)
# -*- coding: utf-8 -*- from email.header import Header from email.mime.text import MIMEText import ...
- How to Programmatically Impersonate Users in SharePoint
Sometimes when creating SharePoint web or console applications, you may need to execute specific c ...
- IE6-8下自定义标签的表现
IE6-8是支持自定义标签,但只支持<xxx-yyy />这样的形式,它会翻译成<xxx-yyy></xxx-yyy> 如果你想内套子标签会失败, <ms-k ...