POJ--1966--Cable TV Network【无向图顶点连通度】
链接:http://poj.org/problem?id=1966
题意:一个无向图,n个点,m条边,求此图的顶点连通度。
思路:顶点连通度,即最小割点集里的割点数目。一般求无向图顶点连通度的方法是转化为网络流的最小割。
建图:
(1)原图每一个点i拆点,拆为i‘和i’‘,i’到i‘’连一条弧容量为1。
(2)对于原图中存在的边(u, v),连两条弧(u‘, v')和(v'', u'),容量INF。
(3)找一个源点i。这个点不能和其它全部点都相邻否则无法找到最小割,以这个点i''为源点,枚举汇点j'。
图建好了之后求n-1遍最大流。答案最小的那个就是此图的顶点连通度,i'到i''满流的i点组成了最小割点集。
#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 1010
#define eps 1e-7
#define INF 0x3F3F3F3F //0x7FFFFFFF
#define LLINF 0x7FFFFFFFFFFFFFFF
#define seed 1313131
#define MOD 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node{
int u,v,w,next;
}edge[500000],edge2[500000];
int head[120],dist[120],cur[120],fa[120],num[120],vis[120];
int n,m,k,cnt,nn,src,sink;
void add_edge(int a,int b,int c){
edge2[cnt].u = a;
edge2[cnt].v = b;
edge2[cnt].w = c;
edge2[cnt].next = head[a];
head[a] = cnt++;
}
void bfs()
{
int x,i,j;
queue<int> q;
memset(dist,-1,sizeof(dist));
memset(num,0,sizeof(num));
q.push(sink);
dist[sink] = 0;
num[0] = 1;
while(!q.empty()){
x = q.front();
q.pop();
for(i=head[x];i!=-1;i=edge[i].next){
if(dist[edge[i].v]<0){
dist[edge[i].v] = dist[x] + 1;
num[dist[edge[i].v]]++;
q.push(edge[i].v);
}
}
}
} int augment()
{
int x=sink,a=INF;
while(x!=src){
a = min(a,edge[fa[x]].w);
x = edge[fa[x]].u;
}
x=sink;
while(x!=src){
edge[fa[x]].w -= a;
edge[fa[x]^1].w += a;
x = edge[fa[x]].u;
}
return a;
} int isap()
{
int i,x,ok,minm,flow=0;
bfs();
for(i=0;i<=nn+5;i++) cur[i] = head[i];
x=src;
while(dist[src]<nn){
if(x==sink){
flow += augment();
x = src;
}
ok=0;
for(i=cur[x];i!=-1;i=edge[i].next){
if(edge[i].w && dist[x]==dist[edge[i].v]+1){
ok=1;
fa[edge[i].v] = i;
cur[x] = i;
x = edge[i].v;
break;
}
}
if(!ok){
minm = nn;
for(i=head[x];i!=-1;i=edge[i].next)
if(edge[i].w && dist[edge[i].v]<minm) minm=dist[edge[i].v];
if(--num[dist[x]]==0)break;
num[dist[x]=minm+1]++;
cur[x]=head[x];
if(x!=src) x=edge[fa[x]].u;
}
}
return flow;
}
int main(){
int i,j;
int a,b;
while(scanf("%d%d",&n,&m)!=EOF){
memset(head,-1,sizeof(head));
cnt = 0;
for(i=0;i<n;i++){
add_edge(i,i+n,1);
add_edge(i+n,i,0);
}
for(i=0;i<m;i++){
scanf(" (%d,%d)",&a,&b);
add_edge(a+n,b,INF);
add_edge(b,a+n,0);
add_edge(b+n,a,INF);
add_edge(a,b+n,0);
}
int ans = INF;
nn = n * 2;
for(i=0;i<n;i++){
memset(vis,0,sizeof(vis));
for(j=head[i];j!=-1;j=edge2[j].next){
vis[edge2[j].v] = 1;
}
int sum = 0;
for(j=0;j<n;j++){
if(vis[j]) sum++;
}
if(sum < n - 1){
src = i + n;
break;
}
}
for(i=1;i<n;i++){
sink = i;
memcpy(edge,edge2,sizeof(node)*cnt);
int temp = isap();
ans = min(ans, temp);
}
if(ans == INF) ans = n;
printf("%d\n",ans);
}
return 0;
}
POJ--1966--Cable TV Network【无向图顶点连通度】的更多相关文章
- POJ 1966 Cable TV Network(顶点连通度的求解)
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- POJ 1966 Cable TV Network (无向图点连通度)
[题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...
- POJ 1966 Cable TV Network
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4702 Accepted: 2173 ...
- POJ 1966 Cable TV NETWORK(网络流-最小点割集)
Cable TV NETWORK The interconnection of the relays in a cable TV net ...
- poj 1966 Cable TV Network 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...
- POJ 1966 Cable TV Network (点连通度)【最小割】
<题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见 >>> 本题是求点连通度, ...
- POJ 1966 Cable TV Network (算竞进阶习题)
拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...
- POJ 1966 Cable TV Network 【经典最小割问题】
Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...
- POJ - 1966 Cable TV Network (最大流求点连通度)
题意:求一个无向图的点连通度.点联通度是指,一张图最少删掉几个点使该图不连通:若本身是非连通图,则点连通度为0. 分析:无向图的点连通度可以转化为最大流解决.方法是:1.任意选择一个点作为源点:2.枚 ...
- POJ 1966 Cable TV Network (最大流最小割)
$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...
随机推荐
- PHP中的 Iterator 与 Generator
在讲解生成器之前先介绍一下迭代器: 在 PHP 中,通常情况下遍历数组使用 foreach 来遍历. 如果我们要想让一个对象可以遍历呢? PHP 为我们提供了 Iterator 接口,只要实现了这个接 ...
- java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
缺少slf4j的包: 添加依赖: 代码: 1 <dependency> 2 <groupId>org.slf4j</groupId> 3 <artifactI ...
- COGS——T 2739. 凯伦和咖啡
http://www.cogs.pro/cogs/problem/problem.php?pid=2739 ★★☆ 输入文件:coffee.in 输出文件:coffee.out 简单对比时 ...
- Android 开发之集成百度地图的定位与地图展示
app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,近期也在做定位功能,可是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了非常长时间来研究 ...
- HDU 1040.As Easy As A+B【排序】【如题(水!水!水!)】【8月24】
As Easy As A+B Problem Description These days, I am thinking about a question, how can I get a probl ...
- 站点搭建从零開始(二)server空间
前面介绍了域名相关知识.这里介绍server,也经常被叫做空间.也就是站点数据实际保存的地方. 1.整体介绍 依据国家相关规定,国内server空间须要进行备案.也就是到相关的机构进行登记.详细方法能 ...
- 详解JSP九个内置对象
[JSP]☆★之详解九个内置对象 在web开发中,为方便开发者,JSP定义了一些由JSP容器实现和管理的内置对象,这些对象可以直接被开发者使用,而不需要再对其进行实例化!本文详解,JSP2 ...
- [雅礼NOIP2018集训 day3]
考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...
- BZOJ 3166 set+可持久化trie树(OR 莫队)
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By Siriu ...
- 你不知道的JavaScript(九)switch语句
在c/c++.java这些强类型的语言中switch语句的表达式和case分支中的条件值都只能是char类型或整数.JS的switch语句有些不同,它可以是JS中的任意一种类型,这一点有些朋友可能并没 ...