题意:给出一个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代码如下:

 #include<cstdio>
#include<cstring>
const int N=+;
const int INF=0x3f3f3f3f;
struct EDGE{
int v,w,next;
}edge[N*N],edge2[N*N];
int g;
int first[N],numh[N],h[N],curedge[N],pre[N];
//int first[N],gap[N],pre[N],dis[N],cur[N];
int min(int a,int b)
{
return a<b?a:b;
}
void AddEdge(int u,int v,int w)
{
edge[g].v=v;
edge[g].w=w;
edge[g].next=first[u];
first[u]=g++;
edge[g].v=u; //反向边
edge[g].w=;
edge[g].next=first[v];
first[v]=g++;
}
int sap(int s,int t,int n,EDGE edge[])
{
int cur_flow,u,tmp,neck,i;
int flow_ans=;
memset(h,,sizeof(h));
memset(numh,,sizeof(numh));
memset(pre,-,sizeof(pre));
for(i=;i<n;i++)
curedge[i]=first[i];
numh[]=n;
u=s;
while(h[s]<n)
{
if(u==t)
{
cur_flow=INF+; //注意:要+1
for(i=s;i!=t;i=edge[curedge[i]].v)
{
if(cur_flow>edge[curedge[i]].w)
{
neck=i;
cur_flow=edge[curedge[i]].w;
}
}
for(i=s;i!=t;i=edge[curedge[i]].v)
{
tmp=curedge[i];
edge[tmp].w-=cur_flow;
edge[tmp^].w+=cur_flow;
}
flow_ans+=cur_flow;
u=neck;
}
for(i=curedge[u];i!=-;i=edge[i].next)
{
if(edge[i].w&&h[u]==h[edge[i].v]+)
break;
}
if(i!=-)
{
curedge[u]=i;
pre[edge[i].v]=u;
u=edge[i].v;
}
else
{
if(==--numh[h[u]])
break;
curedge[u]=first[u];
for(tmp=n,i=first[u];i!=-;i=edge[i].next)
{
if(edge[i].w)
tmp=min(tmp,h[edge[i].v]);
}
h[u]=tmp+;
numh[h[u]]++;
if(u!=s)
u=pre[u];
}
}
return flow_ans;
}
/*int cou;
int sap(int s,int t,int n,EDGE edge[])
{
memset(cur,0,sizeof(cur));
memset(pre,0,sizeof(pre));
int flow=0,i;
int u=pre[s]=s;
cou=n;
for(i=0;i<cou;i++)
{
cur[i]=first[i];
dis[i]=gap[i]=0;
}
gap[0]=cou;
int aug=INF;
while(dis[s]<cou)
{
bool flag=true;
for(int j=cur[u];j!=-1;j=cur[u]=edge[j].next){
int v=edge[j].v;
if(edge[j].w>0&&dis[u]==dis[v]+1)
{
flag=false;
pre[v]=u;
u=v;
if(aug>edge[j].w)
aug=edge[j].w;
if(u==t)
{
flow+=aug;
while(u!=s){
u=pre[u];
edge[cur[u]].w-=aug;
edge[cur[u]^1].w+=aug;
}
aug=INF;
}
break;
}
}
if(!flag)
continue;
int minh=cou;
for(int k=first[u];k!=-1;k=edge[k].next)
{
int v=edge[k].v;
if(edge[k].w>0&&minh>dis[v]){
minh=dis[v];
cur[u]=k;
}
}
if((--gap[dis[u]])==0)
break;
gap[dis[u]=minh+1]++;
u=pre[u];
}
return flow;
}*/
int main()
{
// printf("%d\n",INF);
int i,n,m,u,v,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==)
{
if(n==)
printf("1\n");
else
printf("0\n");
continue;
}
g=;
memset(first,-,sizeof(first));
for(i=;i<n;i++)
AddEdge(i,i+n,);
for(i=;i<m;i++)
{
scanf(" (%d,%d)",&u,&v);
AddEdge(u+n,v,INF);
AddEdge(v+n,u,INF);
}
int ans=INF;
for(i=;i<n;i++)
{
for(k=;k<g;k++)
edge2[k]=edge[k];
ans=min(ans,sap(+n,i,n*,edge2));
}
if(ans==INF)
ans=n;
printf("%d\n",ans);
}
return ;
}

poj 1966(顶点连通度)的更多相关文章

  1. POJ--1966--Cable TV Network【无向图顶点连通度】

    链接:http://poj.org/problem?id=1966 题意:一个无向图,n个点,m条边,求此图的顶点连通度. 思路:顶点连通度,即最小割点集里的割点数目.一般求无向图顶点连通度的方法是转 ...

  2. POJ 1966 ZOJ 2182 Cable TV Network

    无向图顶点连通度的求解,即最少删除多少个点使无向图不连通. 我校“荣誉”出品的<图论算法理论.实现及其应用>这本书上写的有错误,请不要看了,正确的是这样的: 对于每个顶点,分成两个点,v和 ...

  3. Cable TV Network 顶点连通度 (最大流算法)

    Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.       ...

  4. POJ 1966 Cable TV Network(顶点连通度的求解)

                               Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

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

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

  6. poj 1966(求点连通度,边连通度的一类方法)

    题目链接:http://poj.org/problem?id=1966 思路:从网上找了一下大牛对于这类问题的总结:图的连通度问题是指:在图中删去部分元素(点或边),使得图中指定的两个点s和t不连通  ...

  7. poj1966 求顶点连通度

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4563   Accepted: 2118 ...

  8. POJ 1966:Cable TV Network(最小点割集)***

    http://poj.org/problem?id=1966 题意:给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. 思路:将点i拆成a和b,连一条a-&g ...

  9. uva 1660 & poj 1966(点连通度)

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4267   Accepted: 2003 ...

随机推荐

  1. Kubernetes学习之路(四)之Node节点二进制部署

    K8S Node节点部署 1.部署kubelet (1)二进制包准备 [root@linux-node1 ~]# cd /usr/local/src/kubernetes/server/bin/ [r ...

  2. 【NOI2007】社交网络

    [NOI2007]社交网络 Description 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之 ...

  3. jQuery中attr()函数 VS prop()函数

    http://www.365mini.com/page/jquery-attr-vs-prop.htm 在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法 ...

  4. SpringBoot日记——实战篇——Url定向

    搞定了SpringBoot的一些基础核心的东西,我们需要实践一个项目来确认自己学习的东西能被应用,最初,我们会选择自己写一个登陆页面,这也是每个网站几乎都有的门面. 在写之前,还有一些知识点需要记录— ...

  5. node的 node-sass@^4.11.0 出现:npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'

    解决办法: 查看node_modules文件夹,发现,并无vender 文件夹.如下图: 2.  在 node_modules/node-sass 下创建 vendor 文件夹 3.  最后运行: n ...

  6. [硬件配置]Ubuntu 16.04下使用NETGEAR Nighthawk AC1900 (A7000) WIFi USB适配器

    为了增强无人机与地面站之间的传输信号,组里买了这款WiFi信号接收器,无奈只有Windows和Mac OS版本的驱动程序.后来不知道从哪里得来的一个偏方可以安装Ubuntu下的驱动,特此记录. 内核降 ...

  7. 《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理

    8 子弹碰撞处理 为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs 子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁. void Start () { Destroy (game ...

  8. Netty源码分析第5章(ByteBuf)---->第7节: page级别的内存分配

    Netty源码分析第五章: ByteBuf 第六节: page级别的内存分配 前面小节我们剖析过命中缓存的内存分配逻辑, 前提是如果缓存中有数据, 那么缓存中没有数据, netty是如何开辟一块内存进 ...

  9. 面向 Web 开发者的 Sublime Text 插件

    Package Control 在 Sublime Text 上大家都用 Package Control 来管理安装插件,所以它是我们要安装的第一个插件,安装方法见这里.关于 Package Cont ...

  10. Erlang运行时中的无锁队列及其在异步线程中的应用

    本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang ...