题意:

几种插头,每一种都只有一个,但有无限个插头转换器,转换器(a,b) 意味着 可以把b转换为a,有几个设备,每个设备对应一种插头,求所不能匹配插头的设备数量

这个题可以用二分图做 , 我用的是最大流,最后用设备数 减去 最大匹配数即可

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <map>
  7. #include <queue>
  8. #define mem(a, b) memset(a, b, sizeof(a))
  9. using namespace std;
  10. const int maxn = , INF = 0x7fffffff;
  11. int head[maxn], d[maxn], cur[maxn];
  12. int n, m, s, t, z;
  13. int cnt;
  14. map<string, int> mapp;
  15. struct node{
  16. int u, v, c, next;
  17. }Node[maxn*];
  18.  
  19. void add_(int u, int v, int c)
  20. {
  21. Node[cnt].u = u;
  22. Node[cnt].v = v;
  23. Node[cnt].c = c;
  24. Node[cnt].next = head[u];
  25. head[u] = cnt++;
  26. }
  27.  
  28. void add(int u, int v, int c)
  29. {
  30. add_(u, v, c);
  31. add_(v, u, );
  32. }
  33.  
  34. bool bfs()
  35. {
  36. queue<int> Q;
  37. mem(d, );
  38. Q.push(s);
  39. d[s] = ;
  40. while(!Q.empty())
  41. {
  42. int u = Q.front(); Q.pop();
  43. for(int i=head[u]; i!=-; i=Node[i].next)
  44. {
  45. node e = Node[i];
  46. if(!d[e.v] && e.c > )
  47. {
  48. d[e.v] = d[e.u] + ;
  49. Q.push(e.v);
  50. // cout<< u << " " << e.v << " " << t <<endl;
  51. if(e.v == t) break;
  52. }
  53. }
  54. }
  55. return d[t] != ;
  56. }
  57.  
  58. int dfs(int u, int cap)
  59. {
  60. // cout<< cap <<endl;
  61. if(u == t || cap == )
  62. return cap;
  63. int ret = ;
  64. for(int &i=cur[u]; i!=-; i=Node[i].next)
  65. {
  66. node e = Node[i];
  67. if(d[e.v] == d[e.u] + && e.c > )
  68. {
  69. int V = dfs(e.v, min(cap, e.c));
  70. Node[i].c -= V;
  71. Node[i^].c += V;
  72. cap -= V;
  73. ret += V;
  74. // cout<< V <<endl;
  75. if(cap == ) break;
  76. }
  77. }
  78. return ret;
  79. }
  80.  
  81. int dinic()
  82. {
  83. int ans = ;
  84. while(bfs())
  85. {
  86. memcpy(cur, head, sizeof(head));
  87. ans += dfs(s, INF);
  88. // cout<< ans <<endl;
  89. }
  90. return ans;
  91. }
  92. int main()
  93. {
  94. cin>> n;
  95. mem(head, -);
  96. s = , t = n + *m + *z + ;
  97. for(int i=; i<=n; i++)
  98. {
  99. string str;
  100. cin>> str;
  101. mapp[str] = i;
  102. add(s, i, );
  103. }
  104. cin>> m;
  105. for(int i=; i<=m; i++)
  106. {
  107. string str, sstr;
  108. cin>> str >> sstr;
  109. add(n+i, n+m+i, );
  110. add(n+m+i, t, INF);
  111. if(!mapp[sstr])
  112. {
  113. mapp[sstr] = n + m* + i;
  114. }
  115. add(mapp[sstr], n+i, INF);
  116. }
  117. cin>> z;
  118. for(int i=; i<=z; i++)
  119. {
  120. string u, v;
  121. cin>> u >> v;
  122. if(!mapp[u])
  123. mapp[u] = n+*m+i;
  124. if(!mapp[v])
  125. mapp[v] = n+*m+z+i;
  126. // add(s, mapp[v], INF);
  127. add(mapp[v], mapp[u], INF);
  128. }
  129. // cout<< m << " " <<dinic() <<endl;
  130. cout<< m - dinic() <<endl;
  131.  
  132. return ;
  133. }

A Plug for UNIX POJ - 1087(模板题 没啥好说的。。就用了一个map)的更多相关文章

  1. (网络流 模板)A Plug for UNIX -- poj -- 1087

    链接: http://poj.org/problem?id=1087 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#probl ...

  2. C - A Plug for UNIX POJ - 1087 网络流

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

  3. C - A Plug for UNIX - poj 1087(最大流)

    题目大意:这个题意有些蛋疼,看了很大会才明白什么意思,有N个插座,这些插座都是有类型的只能给这种类型的电器充电,下面接着给了M种电器,和电器的插头类型,还有K种转换器,可以把一种类型转换成另一种,转换 ...

  4. poj 1986tarjan模板题

    #include<iostream> #include<vector> using namespace std; const int N=40010; int pre[N];/ ...

  5. poj 1330lca模板题离线算法

    #include<iostream> #include<vector> using namespace std; const int MAX=10001; int pre[MA ...

  6. Jungle Roads POJ - 1251 模板题

    #include<iostream> #include<cstring> #include<algorithm> using namespace std; cons ...

  7. POJ 2823 Sliding Window​ (模板题)【单调队列】

    <题目链接> <转载于>>> > 题目大意: 给你一段序列和一个长为k的窗口,这个窗口从最左边逐渐向右滑,直到滑到最右边,问你,该窗口在滑动的过程中,最大值和 ...

  8. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

  9. POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for UNIX / UVAlive 5418 A Plug for UNIX / SCU 1671 A Plug for UNIX (网络流)

    POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for ...

随机推荐

  1. Tensorflow[源码安装时bazel行为解析]

    0. 引言 通过源码方式安装,并进行一定程度的解读,有助于理解tensorflow源码,本文主要基于tensorflow v1.8源码,并借鉴于如何阅读TensorFlow源码. 首先,自然是需要去b ...

  2. 使用Webuploader大文件分片传输

    背景:50G大文件的HTTP上传至服务器. 好了,根据这个命题,可以开始研究我们怎么做才能把这么大的文件上传成功. 分片上传是肯定的,断点续传也是要有的,进度可视化那就更好了,基于这些,我选择了Web ...

  3. python---pandas.merge使用

    merge 函数参数 ”’ merge: 合并数据集, 通过left, right确定连接字段,默认是两个数据集相同的字段 参数 说明 left 参与合并的左侧DataFrame right 参与合并 ...

  4. Luogu4156 WC2016 论战捆竹竿 KMP、同余类最短路、背包、单调队列

    传送门 豪华升级版同余类最短路-- 官方题解 主要写几个小trick: \(1.O(nm)\)实现同余类最短路: 设某一条边长度为\(x\),那么我们选择一个点,在同余类上不断跳\(x\),可以形成一 ...

  5. [UWP 自定义控件]了解模板化控件(2.1):理解ContentControl

    UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...

  6. Jmeter(二十九)_dotnet搭建本地接口服务

    这里使用的服务名为Bookshelf,在github上,自行下载.要运行此服务,需要.Net Core SDK 2.1或更高版本.如果尚未安装,从.Net Core官方网站下载并安装. 在本地克隆项目 ...

  7. require.ensure的用法;异步加载-代码分割;

    webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...

  8. 把cnblogs变成简书 - cnblogs博客自定义皮肤css样式

    吐槽 博客园cnblogs作为老牌的IT技术博客类网站,为广大的开发者提供了非常不错的学习交流平台. 虽然博客内容才是重点,但是如果有赏心悦目的页面不更好吗! cnblogs可以更换博客模板,并且提供 ...

  9. 对于League of Legends的分析

    League of Legends是一款在国内甚至国际上都很受欢迎的一款网络竞技行的游戏.它是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战 ...

  10. 第三周Linux学习报告

    Linux内核源代码简介: arch/x86中内容重点关注 init目录重要,内核启动相关的代码基本上都在init目录下.如main.c等.Start_kernel函数相当于普通C程序的main函数. ...