poj1815Friendship(最小割求割边)
链接
题意为去掉多少个顶点使图不连通,求顶点连通度问题。拆点,构造图,对于<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(最小割求割边)相关推荐
- Sabotage UVA - 10480 (最小割+求最小割去掉的具体边+ISAP)
传送门 题意:给定n个点,m条带权无向边,源点s=1,汇点t=2.去掉一些边之后使s,t不连通,求去掉的这些边(而且还要满足去掉的边权和是所有答案中最小的--最小割). n<=50,m<= ...
- luogu P1345 [USACO5.4]奶牛的电信Telecowmunication(建图技巧 - “割点”模板 、最小割)
P1345 [USACO5.4]奶牛的电信Telecowmunication 最小割,我们建立一个超级源点和超级汇点,做一下最小割,即可得到通过割边使得整张图变成两个完全不相连的集合的最小花费. 同样 ...
- 【学习笔记】无向图最小割
零.概述 什么离谱的人会研究这种离谱的东西啊--从定义,到构造,到性质,我完全想象不到 idea\rm ideaidea 的来源-- 研究带权无向图上,任意两点之间的最小割.最朴素的方法是做 O(n2 ...
- 分治最小割 学习总结
这是一种可以较快的求解任意两点间最小割的算法 正常的暴力的话我们要枚举点对,一共要做O(n^2)次网络流 而我们注意到设某一个S->T最小割中两个点x,y,满足x在S集合且y在T集合中 设S-& ...
- 图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)
1.算法介绍 最小割算法(Minimum Cut)是图像分割的经典算法之一,同时也在"Graph Cut"."Grab Cut"等算法中都有被使用过.最小割最大 ...
- POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】
题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- UVA - 10480 Sabotage(最小割-最大流+输出割边)
题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...
- 【BZOJ - 1001】狼抓兔子(无向图网络流,最小割,或平面图转对偶图求最短路SPFA)
题干: 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
最新文章
- 阿里工程师告诉你,在性能测试的过程中会遇到哪些问题?
- 有向连通图增加多少边构成强联通(hdu3836,poj1236)
- 都在抢论文第一作者,如何处理?
- sonarqube报错解决办法:Caused by: java.io.FileNotFoundException: /opt/sonar/temp/sharedmemory (权限不够)
- textarea限制字符数_PAT乙级-1002 写出这个数
- datax mysql replace_DataX-MySQL(读写)
- C#如何去掉字符串中所有空格
- Google seo图片优化技巧
- .net mysql参数化查询_MySQL参数化查询的IN 和 LIKE
- 这是我见过最接地气的PCB设计指南了!
- 倪光南——世人笑我太疯癫,我笑他人看不穿
- 这位程序员桌面很干净
- NYOJ_170聪明的kk
- 机器学习算法-线性回归
- 【Pytorch】data.norm(几种范数(norm)的详细介绍)
- 群晖download station使用sftp下载文件
- 21款实用的Linux命令行终端工具
- dedecms xss oday通杀所有版本 可getshell
- 大佬带你看DevOps
- 上交大计算机专业排名,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...