题目大概是说,一个村庄有n间房子,房子间有m条双向路相连。1号房子有网络,有k间房子要通过与1号房子相连联网,且一条路上不能有同样颜色的线缆,问最少要用几种颜色的线缆。

二分枚举颜色个数,建立容量网络跑最大流判断解是否成立:源点是1,所有要联网的房子向汇点连容量1的边,所有双向边改为容量为枚举的解的边,如果最大流等于k那这个解就成立。

注意重边。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. #define INF (1<<30)
  7. #define MAXN 555
  8. #define MAXM 555*555*2
  9.  
  10. struct Edge{
  11. int v,cap,flow,next;
  12. }edge[MAXM];
  13. int vs,vt,NE,NV;
  14. int head[MAXN];
  15.  
  16. void addEdge(int u,int v,int cap){
  17. edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=;
  18. edge[NE].next=head[u]; head[u]=NE++;
  19. edge[NE].v=u; edge[NE].cap=; edge[NE].flow=;
  20. edge[NE].next=head[v]; head[v]=NE++;
  21. }
  22.  
  23. int level[MAXN];
  24. int gap[MAXN];
  25. void bfs(){
  26. memset(level,-,sizeof(level));
  27. memset(gap,,sizeof(gap));
  28. level[vt]=;
  29. gap[level[vt]]++;
  30. queue<int> que;
  31. que.push(vt);
  32. while(!que.empty()){
  33. int u=que.front(); que.pop();
  34. for(int i=head[u]; i!=-; i=edge[i].next){
  35. int v=edge[i].v;
  36. if(level[v]!=-) continue;
  37. level[v]=level[u]+;
  38. gap[level[v]]++;
  39. que.push(v);
  40. }
  41. }
  42. }
  43.  
  44. int pre[MAXN];
  45. int cur[MAXN];
  46. int ISAP(){
  47. bfs();
  48. memset(pre,-,sizeof(pre));
  49. memcpy(cur,head,sizeof(head));
  50. int u=pre[vs]=vs,flow=,aug=INF;
  51. gap[]=NV;
  52. while(level[vs]<NV){
  53. bool flag=false;
  54. for(int &i=cur[u]; i!=-; i=edge[i].next){
  55. int v=edge[i].v;
  56. if(edge[i].cap!=edge[i].flow && level[u]==level[v]+){
  57. flag=true;
  58. pre[v]=u;
  59. u=v;
  60. //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
  61. aug=min(aug,edge[i].cap-edge[i].flow);
  62. if(v==vt){
  63. flow+=aug;
  64. for(u=pre[v]; v!=vs; v=u,u=pre[u]){
  65. edge[cur[u]].flow+=aug;
  66. edge[cur[u]^].flow-=aug;
  67. }
  68. //aug=-1;
  69. aug=INF;
  70. }
  71. break;
  72. }
  73. }
  74. if(flag) continue;
  75. int minlevel=NV;
  76. for(int i=head[u]; i!=-; i=edge[i].next){
  77. int v=edge[i].v;
  78. if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
  79. minlevel=level[v];
  80. cur[u]=i;
  81. }
  82. }
  83. if(--gap[level[u]]==) break;
  84. level[u]=minlevel+;
  85. gap[level[u]]++;
  86. u=pre[u];
  87. }
  88. return flow;
  89. }
  90.  
  91. int n,m,k,h[];
  92. bool G[][];
  93. bool isok(int mx){
  94. vs=; vt=; NV=n; NE=;
  95. memset(head,-,sizeof(head));
  96. for(int i=; i<k; ++i) addEdge(h[i],vt,);
  97. for(int i=; i<=n; ++i){
  98. for(int j=; j<=n; ++j){
  99. if(G[i][j]) addEdge(i,j,mx);
  100. }
  101. }
  102. return ISAP()==k;
  103. }
  104. int main(){
  105. int t,a,b;
  106. scanf("%d",&t);
  107. while(t--){
  108. memset(G,,sizeof(G));
  109. scanf("%d%d%d",&n,&m,&k);
  110. for(int i=; i<k; ++i) scanf("%d",h+i);
  111. for(int i=; i<m; ++i){
  112. scanf("%d%d",&a,&b);
  113. G[a][b]=G[b][a]=;
  114. }
  115. int l=,r=k;
  116. while(l<r){
  117. int mid=l+r>>;
  118. if(isok(mid)) r=mid;
  119. else l=mid+;
  120. }
  121. printf("%d\n",l);
  122. }
  123. return ;
  124. }

SPOJ287 Smart Network Administrator(最大流)的更多相关文章

  1. SPOJ NETADMIN - Smart Network Administrator(二分)(网络流)

    NETADMIN - Smart Network Administrator #max-flow The citizens of a small village are tired of being ...

  2. [SPOJ 287] Smart Network Administrator 二分答案+网络流

    The citizens of a small village are tired of being the only inhabitants around without a connection ...

  3. Spoj-NETADMIN Smart Network Administrator

    The citizens of a small village are tired of being the only inhabitants around without a connection ...

  4. spoj 287 NETADMIN - Smart Network Administrator【二分+最大流】

    在spoj上用题号找题就已经是手动二分了吧 把1作为汇点,k个要入网的向t连流量为1的边,因为最小颜色数等于最大边流量,所以对于题目所给出的边(u,v),连接(u,v,c),二分一个流量c,根据最大流 ...

  5. SPOJ287 NETADMIN - Smart Network Administrator

    传送门[洛谷] 常见套路? 关键点连新建汇点 流量1 源点1 原图中的边 二分流量. 二分+判满流 做完了. 附代码. #include<cstdio> #include<cstri ...

  6. SPOJ 0287 Smart Network Administrator

    题目大意:一座村庄有N户人家.只有第一家可以连上互联网,其他人家要想上网必须拉一根缆线通过若干条街道连到第一家.每一根完整的缆线只能有一种颜色.网管有一个要求,各条街道内不同人家的缆线必须不同色,且总 ...

  7. routing decisions based on paths, network policies, or rule-sets configured by a network administrator

    https://en.wikipedia.org/wiki/Border_Gateway_Protocol Border Gateway Protocol (BGP) is a standardize ...

  8. Power Network (最大流增广路算法模板题)

    Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20754   Accepted: 10872 Description A p ...

  9. POJ 1459 &amp;&amp; ZOJ 1734--Power Network【最大流dinic】

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 25108   Accepted: 13077 D ...

随机推荐

  1. String的内存分配

    1.String类是final类不能被继承 2.String str="abc"的内部工作 (1)先在栈中定 一个名为str的String类的引用变量 String str: (2 ...

  2. 程序员必读:Linux内存管理剖析

    现在的服务器大部分都是运行在Linux上面的,所以作为一个程序员有必要简单地了解一下系统是如何运行的. 对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  3. 滚动光效shader

    Shader "Custom/LightMove" { Properties { _MainTex ("Base (RGB)", 2D) = "whi ...

  4. L18 如何快速查找文档获得帮助

    原地址:http://www.howzhi.com/course/286/lesson/2121 查找文档快速 苹果提供了丰富的文档,以帮助您成功构建和部署你的应用程序,包括示例代码,常见问题解答,技 ...

  5. Clustering by fast search and find of density peaks

    参考:http://www.52ml.net/16296.html 这个算法的优点就在于,它首先一步就能找到聚类中心,然后划分类别.而其他算法需要反复迭代才能找到中心聚类. 就是不知道代码该怎么写.. ...

  6. Struts2配置文件模板

    <?xml version = "1.0" encoding = "UTF-8"?><!--下面是Struts2配置文件的DTD信息 --&g ...

  7. PHPStorm+Wamp+Xdebug+Windows7调试代码

    Wamp 集成环境 PHPStorm+Xdebug 调试代码 2013.04.16 花了两个小时时间终于 , 配置成功了 ! 我的开发环境如下 , 其它环境也可以参考我的配置 开发环境 : Windo ...

  8. django动态表格总结

    应用场景: A与B之间存在一对多关系. CBV实现方案: CreateView/UpdateView + inlineformset + jquery 具体: view方面:重写post/get方法, ...

  9. 《linux备份与恢复之二》3.19 dump(文件系统备份)

    <Linux指令从初学到精通>第3章文件管理,本章介绍了许多常用命令,如cp.ln.chmod.chown.diff.tar.mv等,因为这些都与文件管理相关,在日常的使用中经常用到,因此 ...

  10. 【Spring】Spring系列6之Spring整合Hibernate

    6.Spring整合Hibernate 6.1.准备工作 6.2.示例 com.xcloud.entities.book com.xcloud.dao.book com.xcloud.service. ...