链接

题意为去掉多少个顶点使图不连通,求顶点连通度问题。拆点,构造图,对于<u,v>可以变成<u2,v1> <v2,u1>容量为无穷,<u1,u2>容量为1.那么求出来的最大流(即最小割)就为所需要删除的顶点个数,需要字典序输出,从小到大枚举顶点,如果不加入当前点,最小割变小了的话 ,说明这个点是肯定要删除的。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <queue>
  5 #include <algorithm>
  6 using namespace std;
  7 #define INF 0x3f3f3f
  8 const int N = 415;
  9 #define M 160015
 10 struct node
 11 {
 12     int u,v,next;
 13     int w;
 14 } edge[M<<1];
 15 int head[N],t,vis[N],pp[N],dis[N];
 16 int o[N];
 17 int st,en;
 18 int x[N][N],f[N];
 19 void init()
 20 {
 21     t=0;
 22     memset(head,-1,sizeof(head));
 23 }
 24 void add(int u,int v,int w)
 25 {
 26     edge[t].u = u;
 27     edge[t].v = v;
 28     edge[t].w = w;
 29     edge[t].next = head[u];
 30     head[u] = t++;
 31     edge[t].u = v;
 32     edge[t].v = u;
 33     edge[t].w = 0;
 34     edge[t].next = head[v];
 35     head[v] = t++;
 36 }
 37 int bfs()
 38 {
 39     int i,u;
 40     int w;
 41     memset(dis,-1,sizeof(dis));
 42     queue<int>q;
 43     q.push(st);
 44     dis[st] = 0;
 45     while(!q.empty())
 46     {
 47         u = q.front();
 48         q.pop();
 49         for(i = head[u] ; i != -1 ; i = edge[i].next)
 50         {
 51             int v = edge[i].v;
 52             w = edge[i].w;
 53             if(dis[v]<0&&w>0)
 54             {
 55                 dis[v] = dis[u]+1;
 56                 q.push(v);
 57             }
 58         }
 59     }
 60     if(dis[en]>0) return 1;
 61     return 0;
 62 }
 63 int dfs(int u,int te)
 64 {
 65     int i;
 66     int s;
 67     if(u==en) return te;
 68     for(i = head[u] ; i != -1 ; i = edge[i].next)
 69     {
 70         int v = edge[i].v;
 71         int w = edge[i].w;
 72         if(w>0&&dis[v]==dis[u]+1&&(s=dfs(v,min(te,w))))
 73         {
 74             edge[i].w-=s;
 75             edge[i^1].w+=s;
 76             return s;
 77         }
 78     }
 79     dis[u] = -1;
 80     return 0;
 81 }
 82 int dinic()
 83 {
 84     int flow = 0;
 85     int res;
 86     while(bfs())
 87     {
 88         while(res = dfs(st,INF))
 89         flow+=res;
 90     }
 91     return flow;
 92 }
 93 int main()
 94 {
 95     int n,i,j;
 96     while(scanf("%d%d%d",&n,&st,&en)!=EOF)
 97     {
 98         init();
 99         // memset(x,0,sizeof(x));
100         memset(f,0,sizeof(f));
101         st+=n;
102         for(i = 1; i <= n ; i++)
103         {
104             for(j = 1; j <= n; j++)
105             {
106                 scanf("%d",&x[i][j]);
107                 if(i==j)
108                 {
109                     add(i,i+n,1);
110                 }
111                 else if(x[i][j])
112                 {
113                     add(i+n,j,INF);
114                 }
115             }
116         }
117         if(x[st-n][en])
118         {
119             puts("NO ANSWER!");
120             continue;
121         }
122         int ans = dinic();
123         int cnt = 0;
124         for(i = 1; i <= n ; i++)
125         {
126             if(ans==0) break;
127             if(i==st-n||i==en) continue;
128             f[i] = 1;
129             init();
130             for(j = 1; j <= n ; j++)
131             {
132                 if(f[j]) continue;
133                 for(int e = 1; e <= n ; e++)
134                 {
135                     if(f[e]) continue;
136                     if(j==e)
137                         add(j,j+n,1);
138                     else if(x[j][e])
139                     {
140                         add(j+n,e,INF);
141                     }
142                 }
143             }
144             int ts = dinic();
145             if(ts<ans)
146             {
147                 cnt++;
148                 ans = ts;
149             }
150             else f[i] = 0;
151         }
152         cout<<cnt<<endl;
153         for(j = 1; j <= n; j++)
154             if(f[j])
155                 printf("%d ",j);
156         printf("\n");
157     }
158     return 0;
159 }

View Code

转载于:https://www.cnblogs.com/shangyu/p/3713162.html

poj1815Friendship(最小割求割边)相关推荐

  1. Sabotage UVA - 10480 (最小割+求最小割去掉的具体边+ISAP)

    传送门 题意:给定n个点,m条带权无向边,源点s=1,汇点t=2.去掉一些边之后使s,t不连通,求去掉的这些边(而且还要满足去掉的边权和是所有答案中最小的--最小割). n<=50,m<= ...

  2. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication(建图技巧 - “割点”模板 、最小割)

    P1345 [USACO5.4]奶牛的电信Telecowmunication 最小割,我们建立一个超级源点和超级汇点,做一下最小割,即可得到通过割边使得整张图变成两个完全不相连的集合的最小花费. 同样 ...

  3. 【学习笔记】无向图最小割

    零.概述 什么离谱的人会研究这种离谱的东西啊--从定义,到构造,到性质,我完全想象不到 idea\rm ideaidea 的来源-- 研究带权无向图上,任意两点之间的最小割.最朴素的方法是做 O(n2 ...

  4. 分治最小割 学习总结

    这是一种可以较快的求解任意两点间最小割的算法 正常的暴力的话我们要枚举点对,一共要做O(n^2)次网络流 而我们注意到设某一个S->T最小割中两个点x,y,满足x在S集合且y在T集合中 设S-& ...

  5. 图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)

    1.算法介绍 最小割算法(Minimum Cut)是图像分割的经典算法之一,同时也在"Graph Cut"."Grab Cut"等算法中都有被使用过.最小割最大 ...

  6. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  7. poj 2914(stoer_wanger算法求全局最小割)

    题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t   V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...

  8. UVA - 10480 Sabotage(最小割-最大流+输出割边)

    题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...

  9. 【BZOJ - 1001】狼抓兔子(无向图网络流,最小割,或平面图转对偶图求最短路SPFA)

    题干: 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

最新文章

  1. 阿里工程师告诉你,在性能测试的过程中会遇到哪些问题?
  2. 有向连通图增加多少边构成强联通(hdu3836,poj1236)
  3. 都在抢论文第一作者,如何处理?
  4. sonarqube报错解决办法:Caused by: java.io.FileNotFoundException: /opt/sonar/temp/sharedmemory (权限不够)
  5. textarea限制字符数_PAT乙级-1002 写出这个数
  6. datax mysql replace_DataX-MySQL(读写)
  7. C#如何去掉字符串中所有空格
  8. Google seo图片优化技巧
  9. .net mysql参数化查询_MySQL参数化查询的IN 和 LIKE
  10. 这是我见过最接地气的PCB设计指南了!
  11. 倪光南——世人笑我太疯癫,我笑他人看不穿
  12. 这位程序员桌面很干净
  13. NYOJ_170聪明的kk
  14. 机器学习算法-线性回归
  15. 【Pytorch】data.norm(几种范数(norm)的详细介绍)
  16. 群晖download station使用sftp下载文件
  17. 21款实用的Linux命令行终端工具
  18. dedecms xss oday通杀所有版本 可getshell
  19. 大佬带你看DevOps
  20. 上交大计算机专业排名,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...

热门文章

  1. ASP.NET向Javascript传递变量
  2. Mr.J--HanioTower(递归算法)
  3. 两个getchar,一个getchar,getch的不同点 出现的不同情况
  4. 模仿网易新闻客户端的滚动菜单
  5. CodeProject每日精选: Progress controls 进度条
  6. ECMAScript 6环境搭建
  7. JavaScript学习笔记(六)--数组
  8. 「ECharts」电商平台数据可视化实时监控系统之后台开发
  9. Vue「四」—— 组件生命周期、数据共享
  10. LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)