题意:给出一个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(顶点连通度)相关推荐

  1. POJ 1966 Cable TV Network (最大流最小割)

    $ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...

  2. POJ 1966 枚举 + Dinic

    题意 传送门 POJ 1966 Cable TV Network 题解 若无向图不连通,则图中至少存在两个点不连通,则可以枚举这两个点.若两个不同的点 s , t s,t s,t 因为删去某个点集而不 ...

  3. poj 1966 Cable TV Network 顶点连通度

    题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通. 随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全 ...

  4. [POJ 1966] Cable TV Network

    [题目链接] http://poj.org/problem?id=1966 [算法] 拆点 + 最小割 [代码] #include <algorithm> #include <bit ...

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

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

  6. POJ - 1966 Cable TV Network(最小割-最大流)

    题目链接:点击查看 题目大意:给定一张无向图,求最少去掉多少个点,可以使图不连通 题目分析:让图不连通,也就是让图分成两个部分,这样题目就转换成了最小割的问题了,不过最小割问题是要求最小割边,所以我们 ...

  7. poj 1966 Cable TV Network

    求删除最少的点使得图不联通 将每一个点拆分为i,i',连接i,i'为1,若原图中存在g[u][v] = 1,连接u'到v,容量为INF,连接u,u'为1,连接v,v'为1 枚举源点和汇点,求出最小的最 ...

  8. POJ 1966 求无向图点连通度

    思路: n^2枚举(必须要n^2枚举啊)+拆点 特此嘲讽网上诸多垃圾题解,你们许多都是错的 -yyh //By SiriusRen #include <queue> #include &l ...

  9. Cable TV Network POJ - 1966 最大流最小割定理 点边转化

    最大流最小割定理 任何一个网络的最大流量等于最小割中边的容量之和 即最大流等于最小割 点边转化 节点可以拆为入点和出点 把点的属性添加到入点和出点之间的边上 图的边也可以分两截 在中间加一个节点 把边 ...

最新文章

  1. Linux安装Oracle11G
  2. python有参装饰器 多个装饰器装饰一个
  3. 一天快速入门python
  4. MMC 不能打开文件
  5. OpenGL背景照明
  6. 多线程(同步代码块和同步函数)
  7. java中synchronized(同步代码块和同步方法)详解及区别
  8. 文本相似度、文本匹配、文本聚类
  9. spring异常处理实例(登录例子)
  10. apache+mysql+wordpress的安装建站
  11. win7字体大小怎么设置_XP,win7系统怎么设置自动关机
  12. 新鲜出炉的2012年8月桌面日历壁纸免费下载
  13. [转] 怎么减少编程中的 bug?
  14. 内核模块的加载与卸载
  15. 给chrome手动安装github上插件
  16. android 来电自动接听和自动挂断
  17. uniapp引入阿里巴巴矢量图标库
  18. 修改app的名字和图标
  19. 批处理程序文件夹加密
  20. ActiveX控件的MFC设计之旅-第12步 .

热门文章

  1. 打上花火中文谐音歌词_【1分钟学会闽南语歌】茄子蛋-《浪子回头》-闽南语音译歌词视频...
  2. db2 replace函数的用法_SQL基础知识:常用字符处理函数
  3. 学习操作系统的经典书籍
  4. [codevs 1915] 分配问题
  5. YOLOv2和YOLOv3效果对比
  6. 【五校联考6day2】er
  7. Codeforces 947E/923E Perpetual Subtraction (线性代数、矩阵对角化、DP)
  8. 毕业设计开题计算机进度安排表,关于2021届本科毕业设计选题情况及开题时间的通知...
  9. 死磕java并发cas_死磕 java并发包之AtomicInteger源码分析
  10. fastreport调用frf文件直接打印_来吧~~ 这里提供自助打印~