Usaco 5.4.5

原创 2012年03月26日 20:33:57

这道题要求删去最少的点,使得网络中给定两点不连通。

这个最少的点在图论中有具体的定义,有名称为点连通度。

那么,如何求这个点连通度呢?

我们可以考虑从前面的知识进行转化,前面有一道题目是让我们求边连通度。

那么从边连通度转化为点连通度是否可行呢?答案是可行的。

可以把在网络中的每个点p(这里p代表其中一个点),拆成两个点,p1,p2,在p1,p2之间连一条边,其容量为1.

那么对于原来就在网络中相连的两点(又因为该题为无向图),假设这两点为p,q,拆点后形成p1,p2,q1,q2,

我们可以在p2和q1之间连一条容量为INF(maxint),在q2和p1之间也连一条容量为INF的边。

做一遍最大流,就可以得出点连通度。


另外,题目还要求我们输出字典序最小的组成大小为点连通度的点割集。

这其实也可以借鉴前面那一道求边连通度的题目。

边连通度的题目,我们尝试按升序去删除每一条边,如果改变删除后,网络中的最大流减小,说名改边存在于边割集中。

同理,因为这道题目我们拆点了,并且拆点后的两个子点之间有边相连,所以我们可以尝试按升序去删除每一条拆点拆出来的边,

如果做最大流后流量减少了1(因为拆点出来的边容量为1),那么该点便属于点割集,一直做到最大流为0为止。


洋洋洒洒写了这么多,只是希望大家能懂。微笑

/*
ID: volz.kz.g
PROB: telecow
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define INF 0x7FFFFFFF
using namespace std;
ifstream fin("telecow.in");
ofstream fout("telecow.out");

int n,m,s,t,ans;
struct edge_node{
    int v,c,next;
}e[6000];
int edge_num;
int d[6000],c[6000],v[6000];
int g[501][501];
bool cut[501];

void init(){
    memset(e,0,sizeof(e));
    memset(v,0,sizeof(v));
    edge_num=0;
}
void insert(int a,int b,int c){
    //fout << a << " " << b << " " << c << endl;
    ++edge_num;
    e[edge_num].v=b;e[edge_num].c=c;e[edge_num].next=v[a];v[a]=edge_num;
    ++edge_num;
    e[edge_num].v=a;e[edge_num].c=0;e[edge_num].next=v[b];v[b]=edge_num;
}
void makegraph(){
    init();
    for (int i=1;i<=n;++i)
	for (int j=1;j<=n;++j)
	    if (g[i][j]){
		insert(i+n,j,INF);
		insert(j+n,i,INF);
	    }
    for (int i=1;i<=n;++i)
	if (cut[i])
	    insert(i,i+n,1);
	else 
	    insert(i,i+n,0);
}
int opp(int x){
    return (x%2==1)?x+1:x-1;
}
int maxflow(int x,int lim){
    int ret,min_num,max_flow,i,j;
    if (x==t) return lim;
    min_num=2*n;max_flow=0;
    j=v[x];
    while (j!=0){
	if (e[j].c>0){
	    if (d[e[j].v]+1==d[x]){
		ret=min(lim,e[j].c);
		ret=maxflow(e[j].v,ret);
		e[j].c-=ret;e[opp(j)].c+=ret;
		lim-=ret;max_flow+=ret;
		if (lim==0 || d[s]>=2*n) return max_flow;
	    }
	    min_num=min(min_num,d[e[j].v]+1);
	}
	j=e[j].next;
    }
    if (min_num==d[x]) return max_flow;
    --c[d[x]];
    if (c[d[x]]==0) d[s]=2*n;
    d[x]=min_num;c[d[x]]++;
    return max_flow;
}
int main(){
    memset(g,false,sizeof(g));
    memset(cut,true,sizeof(cut));
    fin >> n >> m >> s >>t;
    for (int i=1;i<=m;++i){
	int a,b;fin >> a >> b;
	g[a][b]=true;g[b][a]=true;
    }
    makegraph();
    c[0]=2*n;
    while (d[s]<2*n) ans+=maxflow(s+n,INF);
    fout << ans << endl;//输出点连通度
    int print[201],print_num=0;
    for (int i=1;i<=n;++i){
	if (i!=s && i!=t){
	    cut[i]=false;
	    makegraph();memset(c,0,sizeof(c));memset(d,0,sizeof(d));
	    int tmp=0;c[0]=2*n;
	    while (d[s]<2*n) tmp+=maxflow(s+n,INF);
	    if (tmp==ans-1){
		ans--;
		print[++print_num]=i;
	    }
	    else{
		cut[i]=true;
	    }
	    if (!ans) break;
	}
    }
    for (int i=1;i<print_num;++i) fout << print[i] << " ";fout << print[print_num] << endl;
    return 0;
}


usaco 5.4.5 Telecowmunication

最小割点转化为最小割边做。 最小字典序割边用退流定理。 建图的技巧是把一个点拆成入点和出点,A变成A1, A2; B变成B1,B2; 那么A,B之间的无向边在新图里变成了g[A][B]=>g[A2][...
  • dyhu083
  • dyhu083
  • 2015年01月31日 16:52
  • 213

[usaco]5.4.5 Big Barn题解

5   Big Barn A Special Treat Farmer John wants to place a big square barn on his square farm. He...
  • sjtuyunlei
  • sjtuyunlei
  • 2011年10月08日 10:19
  • 269

离线安装CDH5.4.5 on CentOS6.5

综合了好多篇文章,结合自己的实践,写的这篇博客。192.168.1.110 master 192.168.1.111 slave1 192.168.1.112 slave2 install CentO...
  • a512982545
  • a512982545
  • 2015年09月04日 15:30
  • 801

USACO 提交测试

/** PROG:ride LANG:C++ ID:zpc19951 **/ #include #include #include #include #include using ...
  • h1021456873
  • h1021456873
  • 2016年10月26日 19:18
  • 280

USACO入门以及提交格式

从今天开始正式尝试usaco,刚注册了账号,发现验证码怎么都刷不出来,后来查了才知道是谷歌的验证码,被墙掉了,只能翻了墙才注册好 【usaco是美国中学生的官方竞赛网站,美国著名在线题库,专门为信息...
  • niskoy
  • niskoy
  • 2015年12月14日 21:52
  • 1764

竞赛题目讲解 - 【USACO TRAINING】子集的和

【USACO TRAINING】子集的和 对于从1到N (1
  • C20192419MYS
  • C20192419MYS
  • 2017年06月11日 22:47
  • 432

USACO gift1

/* ID:kevin_s1 PROG:gift1 LANG:C++ */ #include #include #include using namespace std; str...
  • Kevin_Samuel
  • Kevin_Samuel
  • 2014年05月11日 13:02
  • 688

USACO月赛原题及数据

网上的原题大多是中文的,有些翻译难免引起误解,所以看一看USACO原汁原味的英文原题还是有必要的,我之前一直也苦于无处找到,今天偶然发现下面的网站上有USACO月赛原题。 http://tjsct....
  • creativewang
  • creativewang
  • 2012年10月29日 22:25
  • 9451

USACO历年比赛的数据和解题报告

http://ace.delos.com/MAR07 表示07年三月的比赛,把最后的部分改成”月份+年份“就可以了...
  • alongela
  • alongela
  • 2012年12月01日 15:43
  • 1876

USACO月赛数据

终于找到了usaco月赛的数据…… 网上的原题大多是中文的,有些翻译难免引起误解,所以看一看USACO原汁原味的英文原题还是有必要的,我之前一直也苦于无处找到,今天偶然发现下面的网站上有USAC...
  • zhb1997
  • zhb1997
  • 2014年06月06日 22:55
  • 474
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Usaco 5.4.5
举报原因:
原因补充:

(最多只允许输入30个字)