poj 1966 Cable TV Network
求删除最少的点使得图不联通
将每一个点拆分为i,i',连接i,i'为1,若原图中存在g[u][v] = 1,连接u'到v,容量为INF,连接u,u'为1,连接v,v'为1
枚举源点和汇点,求出最小的最大流即为可以删除的最少点
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF=10000000;
const int N=100005;
struct Node
{
int v,cap,flow,next;
};
Node edges[N];
int n,m,s,t,head[N],e;
int num[N],h[N],curedge[N],pre[N];
int g[500][500];
void add(int u,int v,int cap)
{
edges[e].v=v;
edges[e].cap=cap;
edges[e].flow=0;
edges[e].next=head[u];
head[u]=e++;
}
void Add(int u,int v,int cap)
{
add(u,v,cap);//正向边初始化为cap
add(v,u,0);//反向边初始化为0
}
int Maxflow(int s,int t,int n)
{
int ans=0,i,k,x,d,u;
memset(num,0,sizeof(num));
memset(h,0,sizeof(h));
for(i=0;i<=n;i++) curedge[i]=head[i];
num[n]=n;u=s;
while(h[u]<n)//每一个节点到汇点的距离小于等于n-1
{
if(u==t)
{
d=INF+1;
//获得最短路径上的最小流和流出最小流的节点
for(i=s;i!=t;i=edges[curedge[i]].v) if(d>edges[curedge[i]].cap)
k=i,d=edges[curedge[i]].cap;
//更新图
for(i=s;i!=t;i=edges[curedge[i]].v)
{
x=curedge[i];
edges[x].cap-=d;
edges[x].flow+=d;
edges[x^1].cap+=d;
edges[x^1].flow-=d;
}
ans+=d;u=k;
}
//找到一条允许的边,即最短路径上的边,并将该节点的当前边记录下来。
for(i=curedge[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[u]==h[edges[i].v]+1)
break;
if(i!=-1)
{
curedge[u]=i;
pre[edges[i].v]=u;
u=edges[i].v;
}
else //更新u节点到汇点的最短路
{
//某一种路径出现断流
if(--num[h[u]]==0) break;
//更新u节点的当前边和最短路
curedge[u]=head[u];
for(x=n,i=head[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[edges[i].v]<x)
x=h[edges[i].v];
h[u]=x+1;num[h[u]]++;
if(u!=s) u=pre[u];
}
}
return ans;
}
void makegraph()
{
e = 0;
memset(head,-1,sizeof(head));
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
{
if(g[i][j])
Add(i+n,j,INF);
}
for(int i = 0;i<n;i++)
Add(i,i+n,1);
}
int main()
{
char ch[10];
while(scanf("%d %d",&n,&m)!=EOF)
{
int u,v;
memset(head,-1,sizeof(head));
memset(g,0,sizeof(g));
e = 0;
for(int i = 0;i<m;i++)
{
scanf("%s",ch);
sscanf(ch,"(%d,%d)",&u,&v);
g[u][v] = g[v][u] = 1;
}
int ans = INF;
if(n==1)
{
printf("1\n");
continue;
}
if(m==0)
{
printf("0\n");
continue;
}
s = 2*n;
t = 2*n+1;
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
{
if(i==j||g[i][j])
continue;
makegraph();
Add(s,i+n,INF);
Add(j,t,INF);
int temp = Maxflow(s,t,t+1);
if(temp<ans)
ans = temp;
if(temp>=INF)
{
ans = n;
break;
}
}
if(ans>=INF)
ans = n;
printf("%d\n",ans);
}
return 0;
}
poj 1966 Cable TV Network相关推荐
- POJ 1966 Cable TV Network (最大流最小割)
$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...
- [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 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通. 随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全 ...
- Cable TV Network POJ - 1966 最大流最小割定理 点边转化
最大流最小割定理 任何一个网络的最大流量等于最小割中边的容量之和 即最大流等于最小割 点边转化 节点可以拆为入点和出点 把点的属性添加到入点和出点之间的边上 图的边也可以分两截 在中间加一个节点 把边 ...
- POJ1966 Cable TV Network
一.原题链接:http://poj.org/problem?id=1966 二.题目大意:给你一个很裸的网络,让你判断最少去掉多少个点能够使其不连通.注意是无向图. 三.思路:枚举每个源点和汇点,求每 ...
- UVA1660 电视网络 Cable TV Network(网络流,最小割)
题目链接 题意翻译 电视电缆网络的继电器之间的连接是双向的.如果任意两个继电器之间都连通,那么这个网络就是连通的,否则不连通.特别地,一个空网络或只有一个继电器的网络是连通的. 定义一个有n个继电器的 ...
- POJ 1966 枚举 + Dinic
题意 传送门 POJ 1966 Cable TV Network 题解 若无向图不连通,则图中至少存在两个点不连通,则可以枚举这两个点.若两个不同的点 s , t s,t s,t 因为删去某个点集而不 ...
最新文章
- 【Git入门之十二】DIY Git
- Qt 并行计算圆周率示例
- pd.get_dummies()
- 对话Justin Uberti:RTC的过去、现在和未来
- graph-easy 纯文本图绘制工具(表格或流程图)
- 《Java程序设计》学期总结
- Jquery和雅虎的YQL服务实现天气预报功能!
- python实现文字转语音的合成
- python 文字识别 之 pytesseract
- 【王道计组笔记】总线(2):性能指标分析
- Intellij IDEA 中的 Debug 控制台输出窗口消失
- html货币相关符号
- vs2010安装番茄插件
- 郝斌数据结构教学视频下载地址
- Java算法:经纬度转换 将百度转为高德经纬度
- Reactjs源码分析
- Unity-音频播放
- AutoCAD使用技巧集锦
- ORA-01653: 表 xxx 无法通过 (在表空间 xxx 中) 扩展
- 道路交通标志设计要素和基本原则