题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y。问最少有多少个插头被剩下。

题解:

最大流或者二分图匹配。然而我不知道怎么打二分图匹配。。
打了最大流。这题字符串比较坑爹,我就先把所有字符串编号(去重),然后给每个点编两个号,一个代表它作为插头的编号,一个代表它作为插座的编号。
最坑的是uvaWA了好久最后发现结尾要有一个回车。。。。。

还有数据范围也是个坑点,点起码要开500。

代码如下:(poj上是单组数据,uva和hdu都是多组)

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int N=,L=,INF=(int)1e9;
  9. char s[N][L],c1[L],c2[L];
  10. int ss[N],sc[N],lc[N],rc[N],dis[N],first[N],len,n,m,k,l,num;
  11. struct node{
  12. int x,y,d,next;
  13. }a[];
  14. queue<int> q;
  15.  
  16. int minn(int x,int y){return x<y ? x:y;}
  17.  
  18. void ins(int x,int y,int d)
  19. {
  20. a[++len].x=x;a[len].y=y;a[len].d=d;
  21. a[len].next=first[x];first[x]=len;
  22. a[++len].y=x;a[len].x=y;a[len].d=;
  23. a[len].next=first[y];first[y]=len;
  24. }
  25.  
  26. bool bfs(int st,int ed)
  27. {
  28. while(!q.empty()) q.pop();
  29. memset(dis,-,sizeof(dis));
  30. q.push(st);dis[st]=;
  31. while(!q.empty())
  32. {
  33. int x=q.front();q.pop();
  34. for(int i=first[x];i!=-;i=a[i].next)
  35. {
  36. int y=a[i].y;
  37. if(dis[y]==- && a[i].d)
  38. {
  39. dis[y]=dis[x]+;
  40. q.push(y);
  41. }
  42. }
  43. }
  44. return (dis[ed]!=-);
  45. }
  46.  
  47. int dfs(int x,int ed,int flow)
  48. {
  49. if(x==ed) return flow;
  50. int r=;
  51. for(int i=first[x];i!=-;i=a[i].next)
  52. {
  53. int y=a[i].y;
  54. if(dis[y]==dis[x]+ && a[i].d)
  55. {
  56. int p=minn(flow-r,a[i].d);
  57. p=dfs(y,ed,p);
  58. r+=p;
  59. a[i].d-=p;
  60. a[i^].d+=p;
  61. }
  62. }
  63. if(r==) dis[x]=-;
  64. return r;
  65. }
  66.  
  67. int dinic(int st,int ed)
  68. {
  69. int ans=;
  70. while(bfs(st,ed))
  71. ans+=dfs(st,ed,INF);
  72. return ans;
  73. }
  74.  
  75. int main()
  76. {
  77. int T;
  78. scanf("%d",&T);
  79. while(T--)
  80. {
  81. int st,ed;
  82. scanf("%d",&n);
  83. l=;len=-;
  84. memset(first,-,sizeof(first));
  85. memset(sc,,sizeof(sc));
  86. memset(ss,,sizeof(ss));
  87. for(int i=;i<=n;i++)
  88. {
  89. scanf("%s",s[++l]);
  90. bool bk=;
  91. for(int j=;j<l;j++)
  92. {
  93. if(strcmp(s[l],s[j])==)
  94. {
  95. l--,ss[j]++;
  96. bk=;break;
  97. }
  98. }
  99. if(!bk) ss[l]++;
  100. }
  101. scanf("%d",&m);
  102. for(int i=;i<=m;i++)
  103. {
  104. scanf("%s",s[++l]);
  105. scanf("%s",s[l]);
  106. bool bk=;
  107. for(int j=;j<l;j++)
  108. {
  109. if(strcmp(s[j],s[l])==)
  110. {
  111. l--,sc[j]++;
  112. bk=;break;
  113. }
  114. }
  115. if(!bk) sc[l]++;
  116. }
  117.  
  118. st=;num=;
  119. for(int i=;i<=l;i++)
  120. {
  121. rc[i]=++num;
  122. lc[i]=++num;
  123. }
  124. scanf("%d",&k);
  125. for(int i=;i<=k;i++)
  126. {
  127. scanf("%s%s",c1,c2);
  128. int t1=,t2=;
  129. for(int j=;j<=l;j++)
  130. {
  131. if(strcmp(c1,s[j])==) t1=j;
  132. if(strcmp(c2,s[j])==) t2=j;
  133. if(t1 && t2) break;
  134. }
  135. if(!t1) t1=++l,strcpy(s[l],c1),lc[l]=++num,rc[l]=++num;
  136. if(!t2) t2=++l,strcpy(s[l],c2),lc[l]=++num,rc[l]=++num;
  137. ins(lc[t1],lc[t2],INF);
  138. }
  139. ed=num+;
  140. for(int i=;i<=l;i++)
  141. {
  142. if(ss[i]) ins(rc[i],ed,ss[i]);
  143. if(sc[i]) ins(st,lc[i],sc[i]);
  144. ins(lc[i],rc[i],INF);
  145. }
  146. printf("%d",m-dinic(st,ed));
  147. if(T) printf("\n\n");
  148. else printf("\n");
  149. }
  150. return ;
  151. }

【uva753/poj1087/hdu1526-A Plug for UNIX】最大流的更多相关文章

  1. 【poj1087/uva753】A Plug for UNIX(最大流)

    A Plug for UNIX   Description You are in charge of setting up the press room for the inaugural meeti ...

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

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

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

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

  4. ZOJ1157, POJ1087,UVA 753 A Plug for UNIX (最大流)

    链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action? id=26746 题目意思有点儿难描写叙述 用一个别人描写叙述好的. 我的 ...

  5. TZOJ 1911 A Plug for UNIX(最大流)

    描述 You are in charge of setting up the press room for the inaugural meeting of the United Nations In ...

  6. POJ A Plug for UNIX (最大流 建图)

    Description You are in charge of setting up the press room for the inaugural meeting of the United N ...

  7. UVa 753 A Plug for UNIX (最大流)

    题意:给定 n 种插座,m种设备,和k个转换器,问你最少有几台设备不能匹配. 析:一个很裸的网络流,直接上模板就行,建立一个源点s和汇点t,源点和每个设备连一条边,每个插座和汇点连一条边,然后再连转换 ...

  8. hdu 1087 A Plug for UNIX 最大流

    题意:http://www.phpfans.net/article/htmls/201012/MzI1MDQw.html 1.在一个会议室里有n种插座,每种插座一个: 2.每个插座只能插一种以及一个电 ...

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

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

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

随机推荐

  1. Linux系统木马后门查杀方法详解

    木马和后门的查杀是系统管理员一项长期需要坚持的工作,切不可掉以轻心.以下从几个方面在说明Linux系统环境安排配置防范和木马后门查杀的方法: 一.Web Server(以Nginx为例) 1.为防止跨 ...

  2. 状压DP

    今天稍微看了下状压DP,大概就是这样子的,最主要的就是位运算, i and (1<<k)=0 意味着i状态下没有 k : i and (1<<k)>0 意味着i状态下有 ...

  3. Machine Learning 学习笔记 (1) —— 线性回归与逻辑回归

    本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 梯度下降法 (Gradien ...

  4. CS小分队第一阶段冲刺站立会议(5月6日)

    冲刺阶段第一天 今日任务:完成游戏2048退出自动保存和进入自动读取功能,完善其他功能.

  5. Windows 7系统下删除开机引导项的方法

    Windows 7系统下删除开机引导项的方法: 1.使用管理员权限运行cmd,在命令行窗口使用  bcdedit 回车 2.查找description为你想删除的段,看对应的标识符是多少, 然后使用 ...

  6. background-origin

    background-origin 设置元素背景图片的原始起始位置. 语法: background-origin : border-box | padding-box | content-box; 参 ...

  7. 阴影 box-shadow(二)

    阴影 box-shadow(二) 1.阴影模糊半径与阴影扩展半径的区别 阴影模糊半径:此参数可选,其值只能是为正值,如果其值为0时,表示阴影不具有模糊效果,其值越大阴影的边缘就越模糊: 阴影扩展半径: ...

  8. Careercup - Microsoft面试题 - 6314866323226624

    2014-05-11 05:29 题目链接 原题: Design remote controller for me. 题目:设计一个遥控器. 解法:遥控什么?什么遥控?传统的红外线信号吗?我只能随便说 ...

  9. SQLServer BCP 命令的使用

    现在有一个包含数据的文件,每个字段用“|”分隔,现在要把这些数据导入到数据库的表中. 数据文件如下: R001|20150710 可以使用如下命令: bcp testDB.dbo.testTable ...

  10. JS学习笔记-1--基本知识和注意事项

    1.JS开始的目的主要是验证表单的输入验证 2.是一种具有面向对象能力的.解释型语言.是基于事件驱动的相对较安全的客户端脚本语言 3.JS 特点:松散型:变量不具备一个明确的类型:   对象属性:把属 ...