http://poj.org/problem?id=1087

好久没遇见过这么坑的题了这个题真是挫的够可以的。题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的),

也有其对应型号;可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以将某一型号电源转换成另一型号的。问,你的用电器最少会有多少种无

法充电。也就是问可以用上电的用电器的最大数目,之后用电器总数减去此可用电最大数目即可得到最小不能用电数目。

一开始以为直接将插座,转换器,用电器匹配后跑个最大流模板就行,后来发现想的太简单了。

分析:

1:用电器可直接连插座;

2:用电器可以连接转换器再连接上插座;

3:转换器之间可以相互连接;

4:转换器转换作用是双向的,比如给定转换器可对A和B进行转换,则此转换器可以将A转换成B,也可以将B转换成A;

5:每种转换器的数目是无限的;

6:一个插座只能连接产生一个出处。

7:虚拟一个源点一个汇点即可,源点到插座和插头到汇点的流量为1。

按照这些建图失误了四次之后终于成功A过了。

附加详细建图步骤的备注的AC代码和一组测试数据(测试答案应当为0)

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <queue>
  5. using namespace std;
  6. #define oo 0x3f3f3f3f
  7. int G[][], n, m, p, vis[];
  8. char receptacle[][];
  9. char plug[][];
  10. struct ad
  11. {
  12. char in[], out[];
  13. }adapter[];
  14.  
  15. bool bfs(int Start, int End)
  16. {
  17. memset(vis, , sizeof(vis));
  18. vis[Start] = ;
  19.  
  20. queue<int>Q;
  21. Q.push(Start);
  22.  
  23. while(Q.size())
  24. {
  25. int now = Q.front();
  26. Q.pop();
  27.  
  28. if(now == End)
  29. return true;
  30.  
  31. for(int i=; i<=End; i++)
  32. {
  33. if(!vis[i] && G[now][i]>)
  34. {
  35. vis[i] = vis[now] + ;
  36. Q.push(i);
  37. }
  38. }
  39. }
  40.  
  41. return false;
  42. }
  43.  
  44. int dfs(int Start, int End, int Maxflow)
  45. {
  46. if(Start == End)
  47. return Maxflow;
  48.  
  49. int nowflow = ;
  50.  
  51. for(int i=; i<=End; i++)
  52. {
  53. if(vis[i] == vis[Start] + && G[Start][i]>)
  54. {
  55. int flow = min(G[Start][i], Maxflow - nowflow);
  56.  
  57. flow = dfs(i, End, flow);
  58.  
  59. G[Start][i] -= flow;
  60. G[i][Start] += flow;
  61.  
  62. nowflow += flow;
  63.  
  64. if(nowflow == Maxflow)
  65. break;
  66. }
  67. }
  68.  
  69. return nowflow;
  70. }
  71. int dinic(int Start, int End)
  72. {
  73. int ans = , s;
  74.  
  75. while(bfs(Start, End))
  76. {
  77. s = dfs(Start, End, oo);
  78. if(!s)break;
  79. ans += s;
  80. }
  81.  
  82. return ans;
  83. }
  84. int main()
  85. {
  86. while(~scanf("%d", &n))
  87. {
  88. memset(G, , sizeof(G));
  89.  
  90. for(int i=; i<=n; i++)
  91. scanf("%s", receptacle[i]);
  92.  
  93. scanf("%d", &m);
  94. for(int i=; i<=m; i++)
  95. {
  96. scanf("%*s %s", plug[i]);
  97. for(int j=; j<=n; j++)
  98. {
  99. if(strcmp(receptacle[j], plug[i]) == )///插头和插座可直接连
  100. {
  101. G[j][n+p+i] = ;
  102. }
  103. }
  104. }
  105.  
  106. scanf("%d", &p);
  107. for(int i=; i<=p; i++)
  108. scanf("%s %s", adapter[i].in, adapter[i].out);
  109.  
  110. for(int i=; i<=p; i++)///1~n是插座,n+1~n+p是转换器,n+p+1~n+p+m是插头
  111. {
  112. for(int j=; j<=n; j++)
  113. {
  114. if(strcmp(receptacle[j], adapter[i].in)== || strcmp(receptacle[j], adapter[i].out)==)///插座和转换器匹配
  115. {
  116. G[j][n+i] = ;
  117. }
  118. }
  119.  
  120. for(int j=; j<=m; j++)
  121. {
  122. if(strcmp(plug[j], adapter[i].out)== || strcmp(plug[j], adapter[i].in)==)///转换器和插头匹配
  123. {
  124. G[n+i][n+p+j] = ;
  125. }
  126. }
  127. }
  128.  
  129. for(int i=; i<=p; i++)///转换器之间相连
  130. {
  131. for(int j=; j<=p; j++)
  132. {
  133. if(i!=j && strcmp(adapter[i].in, adapter[j].out)==)
  134. G[n+i][n+j] = oo;
  135. }
  136. for(int j=; j<=p; j++)
  137. {
  138. if(i!=j && strcmp(adapter[i].out, adapter[j].in)==)
  139. G[n+i][n+j] = oo;
  140. }
  141. }
  142.  
  143. int Start = n+p+m+, End = Start+;
  144.  
  145. for(int i=; i<=n; i++)///源点和插座相连
  146. {
  147. G[Start][i] = ;
  148. }
  149.  
  150. for(int i=; i<=m; i++)///插头和汇点相连
  151. {
  152. G[n+p+i][End] = ;
  153. }
  154.  
  155. printf("%d\n", m - dinic(Start, End));
  156. }
  157. return ;
  158. }
  159.  
  160. /*
  161. 16
  162. A
  163. D
  164. X
  165. A
  166. D
  167. A
  168. D
  169. X
  170. D
  171. A
  172. D
  173. D
  174. X
  175. D
  176. X
  177. D
  178. 14
  179. CLOCK B
  180. CLOCK B
  181. CLOCK B
  182. LAPTOP B
  183. LAPTOP B
  184. LAPTOP B
  185. LAPTOP B
  186. LAPTOP B
  187. LAPTOP B
  188. PAGER B
  189. PAGER B
  190. COMB X
  191. CELL C
  192. CELL C
  193. 4
  194. C D
  195. X D
  196. B X
  197. B A
  198. */

poj1087 A Plug for UNIX(网络流最大流)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. POJ1087 A Plug for UNIX 【最大流】

    A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13855   Accepted: 4635 ...

  4. UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)

    解题报告 题意: n个插头m个设备k种转换器.求有多少设备无法插入. 思路: 定义源点和汇点,源点和设备相连,容量为1. 汇点和插头相连,容量也为1. 插头和设备相连,容量也为1. 可转换插头相连,容 ...

  5. 【uva753/poj1087/hdu1526-A Plug for UNIX】最大流

    题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y.问最少有多少个插头被剩下. 题解: 最大流或者二分图匹配.然而我不知道怎么打二分图匹配..打了最大流.这题字符串比较坑 ...

  6. POJ1087 A Plug for UNIX(网络流)

    在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们.你注意到有些设备使用没有插座的插头.你想知道这些设备是否来自建造这个房间时并不存在的国家.对于一些插座,有几个设备使用相应的插头.对于其他 ...

  7. POJ1087 A Plug for UNIX —— 最大流

    题目链接:https://vjudge.net/problem/POJ-1087 A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K T ...

  8. POJ1087:A Plug for UNIX(最大流)

    A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...

  9. POJ1087 A Plug for UNIX(网络流)

                                       A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  10. 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 ...

随机推荐

  1. 【整理】动态加载Web Services

    WebClient client = new WebClient(); String url = "http://localhost/MESAPIWebService/MESAPI.asmx ...

  2. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  3. js prepend() 和append()区别

    prepend() 方法在被选元素的开头(仍位于内部)插入指定内容.prepend() 语法:$(selector).prepend(content) 或 $(selector).prepend(fu ...

  4. 2016-11-10:win7下VMware虚拟机中CentOS6.5网络配置

    在win7环境下,使用桥接和NAT模式配置VMware虚拟机网络,实现宿主机与虚拟机以及虚拟机通过宿主机网卡访问互联网. 1 配置VMware虚拟网络编辑器 VMnet0 桥接模式 VMnet1仅主机 ...

  5. 关于Hibernate XXX is not mapped 错误

    我的实体类是这么配置的 @Entity(name="EntityName")  //必须,name为可选,对应数据库中一的个表 就会出现 XXX is not mapped.   ...

  6. php-fpm 在centos 7下的安装配置

    安装php: sudo yum install php php-fpm php-mysql php-mbstring php-mcrypt php-sockets php-curl php-commo ...

  7. 登陆+注册(三层+sql语句)

    啰嗦:今天面试,遇到这个上级测试,很容易的,因为一个错误,居然最后没做出来,心累 回到家,1小时做完,我特么还加了密,我还验证,可是上天不给我一次重来的机会啊 很垃圾的,小白可以看看,大神可以轻喷 首 ...

  8. Python发送邮件(支持中文)

    # -*- coding: utf-8 -*- from email.header import Header from email.mime.text import MIMEText import ...

  9. How to Programmatically Impersonate Users in SharePoint

      Sometimes when creating SharePoint web or console applications, you may need to execute specific c ...

  10. IE6-8下自定义标签的表现

    IE6-8是支持自定义标签,但只支持<xxx-yyy />这样的形式,它会翻译成<xxx-yyy></xxx-yyy> 如果你想内套子标签会失败, <ms-k ...