题目链接:http://poj.org/problem?id=1815

思路:题目要求是剔除多少个点,可以将其转化为剔除多少条边,因此需要拆点,将点i拆成i,i+n,便容量为1,表示每个人起的传递作用只能是一次。然后就是枚举了,删除某条边,如果求出的最小割比原来的要小,说明减少的是割边集。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define MAXN 444
  8. #define MAXM 4444444
  9. #define inf 1<<30
  10.  
  11. struct Edge{
  12. int v,cap,next;
  13. }edge[MAXM];
  14.  
  15. int n,vs,vt,NE,NV;
  16. int head[MAXN];
  17.  
  18. void Insert(int u,int v,int cap)
  19. {
  20. edge[NE].v=v;
  21. edge[NE].cap=cap;
  22. edge[NE].next=head[u];
  23. head[u]=NE++;
  24.  
  25. edge[NE].v=u;
  26. edge[NE].cap=;
  27. edge[NE].next=head[v];
  28. head[v]=NE++;
  29. }
  30.  
  31. int level[MAXN],gap[MAXN];
  32. void bfs(int vt)
  33. {
  34. memset(level,-,sizeof(level));
  35. memset(gap,,sizeof(gap));
  36. level[vt]=;
  37. gap[level[vt]]++;
  38. queue<int>que;
  39. que.push(vt);
  40. while(!que.empty()){
  41. int u=que.front();
  42. que.pop();
  43. for(int i=head[u];i!=-;i=edge[i].next){
  44. int v=edge[i].v;
  45. if(level[v]!=-)continue;
  46. level[v]=level[u]+;
  47. gap[level[v]]++;
  48. que.push(v);
  49. }
  50. }
  51. }
  52.  
  53. int pre[MAXN],cur[MAXN];
  54. int SAP(int vs,int vt)
  55. {
  56. bfs(vt);
  57. memset(pre,-,sizeof(pre));
  58. memcpy(cur,head,sizeof(head));
  59. int maxflow=,aug=inf;
  60. int u=pre[vs]=vs;
  61. gap[]=NV;
  62. while(level[vs]<NV){
  63. bool flag=false;
  64. for(int &i=cur[u];i!=-;i=edge[i].next){
  65. int v=edge[i].v;
  66. if(edge[i].cap>&&level[u]==level[v]+){
  67. flag=true;
  68. pre[v]=u;
  69. u=v;
  70. aug=min(aug,edge[i].cap);
  71. if(v==vt){
  72. maxflow+=aug;
  73. for(u=pre[v];v!=vs;v=u,u=pre[u]){
  74. edge[cur[u]].cap-=aug;
  75. edge[cur[u]^].cap+=aug;
  76. }
  77. aug=inf;
  78. }
  79. break;
  80. }
  81. }
  82. if(flag)continue;
  83. int minlevel=NV;
  84. for(int i=head[u];i!=-;i=edge[i].next){
  85. int v=edge[i].v;
  86. if(edge[i].cap>&&level[v]<minlevel){
  87. minlevel=level[v];
  88. cur[u]=i;
  89. }
  90. }
  91. if(--gap[level[u]]==)break;
  92. level[u]=minlevel+;
  93. gap[level[u]]++;
  94. u=pre[u];
  95. }
  96. return maxflow;
  97. }
  98.  
  99. int map[MAXN][MAXN];
  100. int cut[MAXN];
  101. void Build()
  102. {
  103. NE=;
  104. memset(head,-,sizeof(head));
  105. for(int i=;i<=n;i++){
  106. if(cut[i])continue;
  107. for(int j=;j<=n;j++){
  108. if(cut[j])continue;
  109. if(i==j)Insert(i,i+n,);
  110. else if(map[i][j])Insert(i+n,j,inf);
  111. }
  112. }
  113. }
  114.  
  115. int main()
  116. {
  117. int maxflow,ans;
  118. while(~scanf("%d%d%d",&n,&vs,&vt)){
  119. for(int i=;i<=n;i++)
  120. for(int j=;j<=n;j++)
  121. scanf("%d",&map[i][j]);
  122. if(map[vs][vt]){
  123. puts("NO ANSWER!");
  124. continue;
  125. }
  126. vs+=n,NV=*n;
  127. memset(cut,,sizeof(cut));
  128. Build();
  129. maxflow=SAP(vs,vt);
  130. ans=;
  131. for(int i=;i<=n;i++){
  132. if(maxflow==)break;
  133. if(i==(vs-n)||i==vt)continue;
  134. cut[i]=;
  135. Build();
  136. int tmp=SAP(vs,vt);
  137. if(tmp<maxflow){ ans++,maxflow=tmp; }
  138. else cut[i]=;
  139. }
  140. printf("%d\n",ans);
  141. bool flag=true;
  142. for(int i=;i<=n;i++){
  143. if(cut[i]){
  144. printf(flag?"%d":" %d",i);
  145. flag=false;
  146. }
  147. }
  148. puts("");
  149. }
  150. return ;
  151. }

poj 1815(最小割、割集)的更多相关文章

  1. USACO 4.4 Pollutant Control (网络流求最小割割集)

    Pollutant ControlHal Burch It's your first day in Quality Control at Merry Milk Makers, and already ...

  2. poj 2125(最小割)

    题目链接:http://poj.org/problem?id=2125 思路:将最小点权覆盖转化为最小割模型,于是拆点建图,将点i拆成i,i+n,其中vs与i相连,边容量为w[i]-,i+n与vt相连 ...

  3. poj 3204(最小割--关键割边)

    Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 7 ...

  4. POJ 3469 最小割 Dual Core CPU

    题意: 一个双核CPU上运行N个模块,每个模块在两个核上运行的费用分别为Ai和Bi. 同时,有M对模块需要进行数据交换,如果这两个模块不在同一个核上运行需要额外花费. 求运行N个模块的最小费用. 分析 ...

  5. 网络流 poj 3308 最小割

    t个样例 n*m的矩阵 L个伞兵 给出每行每列装激光的花费 伞兵的位置 要求杀死所有伞兵 总费用为这些费用的乘积  求花费最小 建图  源点 ->   行   -> 列  -> 汇点 ...

  6. poj 3084 最小割

    题目链接:http://poj.org/problem?id=3084 本题主要在构图上,我采用的是把要保护的房间与源点相连,有intruder的与汇点相连,相对麻烦. #include <cs ...

  7. poj 3469 最小割模板sap+gap+弧优化

    /*以核心1为源点,以核心2为汇点建图,跑一遍最大流*/ #include<stdio.h> #include<string.h> #include<queue> ...

  8. POJ 1815 Friendship(最小割)

    http://poj.org/problem? id=1815 Friendship Time Limit: 2000MS   Memory Limit: 20000K Total Submissio ...

  9. poj 1815 Friendship 字典序最小+最小割

    题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...

随机推荐

  1. 基于SpringBoot的Environment源码理解实现分散配置

    前提 org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性.Envi ...

  2. HBuilder 打包 vue-cli 构建的 APP

    1.在打包之前需要修改一个地方,那就是config->index.js文件,修改assetsPublicPath: '/'为assetsPublicPath: './',截图如下 上面文件改好后 ...

  3. win64 QT(VS2013) 配置 CGAL+libQGLViewer

    网上讲的都不是太全 我来说说把~ 首先感谢这位大神: chenwk891:http://blog.csdn.net/chenwk891/article/details/42171495#reply 还 ...

  4. tmux入门 : 3. 会话

      上一节我们已经将 tmux 安装好了,现在就可以通过以下命令来启动它: $ tmux 启动之后,可以看到命令行最底部多了一条绿色的状态条,上面显示了一些信息,比如计算机名和时间等. 要退出 tmu ...

  5. struts struts拦截器(过滤器)

    在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...

  6. java集成jpush实现客户端推送

    代码地址如下:http://www.demodashi.com/demo/13700.html 前言 java 集成jpush 实现客户端推送 一.准备工作 开发环境: jdk1.6 Eclipse ...

  7. Sphinx-简介及原理

    1.Sphinx简介 是一款基于SQL的高性能全文检索引擎(还不支持NoSQL), 主要优点有: 1).创建和重建索引迅速 2).大数据量时检索速度较快 3).为很多脚本语言设计了检索API(如PHP ...

  8. mysql中如何统计某字段里某个字符的个数

    select * from order where length(order_num)-length(replace(order_num,'8','')) = 4

  9. CentOS7关闭默认防火墙启用iptables防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭firewall: systemctl stop firewalld.service #停止f ...

  10. unity, remove a scene from build settings

    把scene添加到build settings的scenes in build列表里以后,如果想删除,没有菜单可用,但选中按delete即可. 参考:http://answers.unity3d.co ...