poj 1966(顶点连通度)
题意:给出一个n个节点和m条边的图,求该图的顶点连通度。
分析: 顶点连通度的求解可以转换为网络最大流问题。
(1)原图G中的每个顶点v变成网络中的两个顶点v‘和v’‘,顶点v’至v''有一个条弧(有向边)连接,弧容量为1;
(2)原图G中的每条边e=uv,在网络中有两条弧e'=u''v',e''=v''u'与之对应,e'弧容量为oo(无穷) ,e''弧容量为oo(无穷)
(3)A''为源点,B'为汇点,枚举所有汇点,求最小割最小的那个
AC代码如下:
1 #include<cstdio> 2 #include<cstring> 3 const int N=100+5; 4 const int INF=0x3f3f3f3f; 5 struct EDGE{ 6 int v,w,next; 7 }edge[N*N],edge2[N*N]; 8 int g; 9 int first[N],numh[N],h[N],curedge[N],pre[N]; 10 //int first[N],gap[N],pre[N],dis[N],cur[N]; 11 int min(int a,int b) 12 { 13 return a<b?a:b; 14 } 15 void AddEdge(int u,int v,int w) 16 { 17 edge[g].v=v; 18 edge[g].w=w; 19 edge[g].next=first[u]; 20 first[u]=g++; 21 edge[g].v=u; //反向边 22 edge[g].w=0; 23 edge[g].next=first[v]; 24 first[v]=g++; 25 } 26 int sap(int s,int t,int n,EDGE edge[]) 27 { 28 int cur_flow,u,tmp,neck,i; 29 int flow_ans=0; 30 memset(h,0,sizeof(h)); 31 memset(numh,0,sizeof(numh)); 32 memset(pre,-1,sizeof(pre)); 33 for(i=0;i<n;i++) 34 curedge[i]=first[i]; 35 numh[0]=n; 36 u=s; 37 while(h[s]<n) 38 { 39 if(u==t) 40 { 41 cur_flow=INF+1; //注意:要+1 42 for(i=s;i!=t;i=edge[curedge[i]].v) 43 { 44 if(cur_flow>edge[curedge[i]].w) 45 { 46 neck=i; 47 cur_flow=edge[curedge[i]].w; 48 } 49 } 50 for(i=s;i!=t;i=edge[curedge[i]].v) 51 { 52 tmp=curedge[i]; 53 edge[tmp].w-=cur_flow; 54 edge[tmp^1].w+=cur_flow; 55 } 56 flow_ans+=cur_flow; 57 u=neck; 58 } 59 for(i=curedge[u];i!=-1;i=edge[i].next) 60 { 61 if(edge[i].w&&h[u]==h[edge[i].v]+1) 62 break; 63 } 64 if(i!=-1) 65 { 66 curedge[u]=i; 67 pre[edge[i].v]=u; 68 u=edge[i].v; 69 } 70 else 71 { 72 if(0==--numh[h[u]]) 73 break; 74 curedge[u]=first[u]; 75 for(tmp=n,i=first[u];i!=-1;i=edge[i].next) 76 { 77 if(edge[i].w) 78 tmp=min(tmp,h[edge[i].v]); 79 } 80 h[u]=tmp+1; 81 numh[h[u]]++; 82 if(u!=s) 83 u=pre[u]; 84 } 85 } 86 return flow_ans; 87 } 88 /*int cou; 89 int sap(int s,int t,int n,EDGE edge[]) 90 { 91 memset(cur,0,sizeof(cur)); 92 memset(pre,0,sizeof(pre)); 93 int flow=0,i; 94 int u=pre[s]=s; 95 cou=n; 96 for(i=0;i<cou;i++) 97 { 98 cur[i]=first[i]; 99 dis[i]=gap[i]=0; 100 } 101 gap[0]=cou; 102 int aug=INF; 103 while(dis[s]<cou) 104 { 105 bool flag=true; 106 for(int j=cur[u];j!=-1;j=cur[u]=edge[j].next){ 107 int v=edge[j].v; 108 if(edge[j].w>0&&dis[u]==dis[v]+1) 109 { 110 flag=false; 111 pre[v]=u; 112 u=v; 113 if(aug>edge[j].w) 114 aug=edge[j].w; 115 if(u==t) 116 { 117 flow+=aug; 118 while(u!=s){ 119 u=pre[u]; 120 edge[cur[u]].w-=aug; 121 edge[cur[u]^1].w+=aug; 122 } 123 aug=INF; 124 } 125 break; 126 } 127 } 128 if(!flag) 129 continue; 130 int minh=cou; 131 for(int k=first[u];k!=-1;k=edge[k].next) 132 { 133 int v=edge[k].v; 134 if(edge[k].w>0&&minh>dis[v]){ 135 minh=dis[v]; 136 cur[u]=k; 137 } 138 } 139 if((--gap[dis[u]])==0) 140 break; 141 gap[dis[u]=minh+1]++; 142 u=pre[u]; 143 } 144 return flow; 145 }*/ 146 int main() 147 { 148 // printf("%d\n",INF); 149 int i,n,m,u,v,k; 150 while(scanf("%d%d",&n,&m)!=EOF) 151 { 152 if(m==0) 153 { 154 if(n==1) 155 printf("1\n"); 156 else 157 printf("0\n"); 158 continue; 159 } 160 g=0; 161 memset(first,-1,sizeof(first)); 162 for(i=0;i<n;i++) 163 AddEdge(i,i+n,1); 164 for(i=0;i<m;i++) 165 { 166 scanf(" (%d,%d)",&u,&v); 167 AddEdge(u+n,v,INF); 168 AddEdge(v+n,u,INF); 169 } 170 int ans=INF; 171 for(i=1;i<n;i++) 172 { 173 for(k=0;k<g;k++) 174 edge2[k]=edge[k]; 175 ans=min(ans,sap(0+n,i,n*2,edge2)); 176 } 177 if(ans==INF) 178 ans=n; 179 printf("%d\n",ans); 180 } 181 return 0; 182 }
View Code
转载于:https://www.cnblogs.com/frog112111/p/3336638.html
poj 1966(顶点连通度)相关推荐
- POJ 1966 Cable TV Network (最大流最小割)
$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...
- POJ 1966 枚举 + Dinic
题意 传送门 POJ 1966 Cable TV Network 题解 若无向图不连通,则图中至少存在两个点不连通,则可以枚举这两个点.若两个不同的点 s , t s,t s,t 因为删去某个点集而不 ...
- poj 1966 Cable TV Network 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通. 随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全 ...
- [POJ 1966] Cable TV Network
[题目链接] http://poj.org/problem?id=1966 [算法] 拆点 + 最小割 [代码] #include <algorithm> #include <bit ...
- POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】
题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...
- POJ - 1966 Cable TV Network(最小割-最大流)
题目链接:点击查看 题目大意:给定一张无向图,求最少去掉多少个点,可以使图不连通 题目分析:让图不连通,也就是让图分成两个部分,这样题目就转换成了最小割的问题了,不过最小割问题是要求最小割边,所以我们 ...
- poj 1966 Cable TV Network
求删除最少的点使得图不联通 将每一个点拆分为i,i',连接i,i'为1,若原图中存在g[u][v] = 1,连接u'到v,容量为INF,连接u,u'为1,连接v,v'为1 枚举源点和汇点,求出最小的最 ...
- POJ 1966 求无向图点连通度
思路: n^2枚举(必须要n^2枚举啊)+拆点 特此嘲讽网上诸多垃圾题解,你们许多都是错的 -yyh //By SiriusRen #include <queue> #include &l ...
- Cable TV Network POJ - 1966 最大流最小割定理 点边转化
最大流最小割定理 任何一个网络的最大流量等于最小割中边的容量之和 即最大流等于最小割 点边转化 节点可以拆为入点和出点 把点的属性添加到入点和出点之间的边上 图的边也可以分两截 在中间加一个节点 把边 ...
最新文章
- Linux安装Oracle11G
- python有参装饰器 多个装饰器装饰一个
- 一天快速入门python
- MMC 不能打开文件
- OpenGL背景照明
- 多线程(同步代码块和同步函数)
- java中synchronized(同步代码块和同步方法)详解及区别
- 文本相似度、文本匹配、文本聚类
- spring异常处理实例(登录例子)
- apache+mysql+wordpress的安装建站
- win7字体大小怎么设置_XP,win7系统怎么设置自动关机
- 新鲜出炉的2012年8月桌面日历壁纸免费下载
- [转] 怎么减少编程中的 bug?
- 内核模块的加载与卸载
- 给chrome手动安装github上插件
- android 来电自动接听和自动挂断
- uniapp引入阿里巴巴矢量图标库
- 修改app的名字和图标
- 批处理程序文件夹加密
- ActiveX控件的MFC设计之旅-第12步 .
热门文章
- 打上花火中文谐音歌词_【1分钟学会闽南语歌】茄子蛋-《浪子回头》-闽南语音译歌词视频...
- db2 replace函数的用法_SQL基础知识:常用字符处理函数
- 学习操作系统的经典书籍
- [codevs 1915] 分配问题
- YOLOv2和YOLOv3效果对比
- 【五校联考6day2】er
- Codeforces 947E/923E Perpetual Subtraction (线性代数、矩阵对角化、DP)
- 毕业设计开题计算机进度安排表,关于2021届本科毕业设计选题情况及开题时间的通知...
- 死磕java并发cas_死磕 java并发包之AtomicInteger源码分析
- fastreport调用frf文件直接打印_来吧~~ 这里提供自助打印~