奶牛通讯 usaco 网络流

这道题很有意思,原题是只需输出最小割集大小,现在oj上改成了输出字典序最小的割集;

题解:可以考虑从小到大删边,若删掉这条边后,最小割变小,保持不变,记录此时的最小割大小;

若最小割不变,恢复这条边;

这样做的原因是什么呢?从小到大可以保证字典序的要求,删完边后若最小割减小,这条边一定在最小割上,删掉它不再恢复可以保证不在把这条通路上的其他边也收进来;

网络流博大精深,还是需要好好体会的;

但在此之前,应该先会敲代码;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdlib>
 6 #include<ctime>
 7 #include<algorithm>
 8 using namespace std;
 9 const int maxn=400;
10 const int inf=1000000000;
11 int S,T,n,m;
12 struct node{
13     int y,next,re,flow;
14 }e[maxn<<4],e2[maxn<<4];
15 int linkk[maxn],len=0;
16 void insert(int x,int y,int flow){
17     e[++len].y=y;
18     e[len].next=linkk[x];
19     linkk[x]=len;
20     e[len].flow=flow;
21     e[len].re=len+1;
22     e[++len].y=x;
23     e[len].next=linkk[y];
24     linkk[y]=len;
25     e[len].flow=0;
26     e[len].re=len-1;
27 }
28 void init(){
29     scanf("%d%d%d%d",&n,&m,&S,&T);
30     int x,y;
31     for(int i=1;i<=m;i++){
32         scanf("%d%d",&x,&y);
33         if(x==S){insert(S,y,inf);insert(y+n,S,inf);}
34         else if(y==S){insert(S,x,inf);insert(x+n,S,inf);}
35         else if(x==T){insert(T,y,inf);insert(y+n,T,inf);}
36         else if(y==T){insert(x+n,T,inf);insert(T,x,inf);}
37         else {insert(x+n,y,inf);insert(y+n,x,inf);}
38     }
39     for(int i=1;i<=n;i++)if(S!=i&&T!=i)insert(i,i+n,1);
40 }
41 bool flag=1;
42 int flow=inf,vis[maxn],ans=0,f[maxn];
43 void dfs(int x,int a){
44     if(f[x])return;
45     vis[x]=1;
46     if(x==T){
47         flag=1;flow=a;ans+=flow;return;
48     }
49     for(int i=linkk[x];i;i=e[i].next){
50         if(vis[e[i].y]||(!e[i].flow))continue;
51         dfs(e[i].y,min(a,e[i].flow));
52         if(flag){
53             e[i].flow-=flow;e[e[i].re].flow+=flow;return;
54         }
55     }
56 }
57 void work(){
58     ans=0;flag=1;
59     while(flag){
60         flag=0;
61         memset(vis,0,sizeof(vis));
62         dfs(S,inf);
63     }
64 }
65 int main(){
66     freopen("1.in","r",stdin);
67     freopen("1.out","w",stdout);
68     init();
69     memcpy(e2,e,sizeof(e));
70     work();
71     cout<<ans<<endl;
72     int q[maxn],sum=ans,k=ans,tail=0;
73     for(int i=1;i<=n;i++){
74         if(i==S||i==T)continue;
75         memcpy(e,e2,sizeof(e));
76         f[i]=1;
77         work();
78         if(ans<sum)q[++tail]=i,sum=ans;
79         else f[i]=0;
80     }
81     sort(q+1,q+tail+1);
82     for(int i=1;i<=k;i++)printf("%d ",q[i]);
83 }

时间: 2024-10-11 23:08:13

奶牛通讯 usaco 网络流的相关文章

codevs 1955 光纤通信 USACO

1955 光纤通信 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 查看运行结果 题目描述 Description 农民John 想要用光纤连通他的N (1 <= N <= 1,000)个牲口棚(编号1..N).但是,牲口棚位于一个大池塘边,他仅可以连通相邻的牲口棚.John不需要连通所有的牲口棚, 因为只有某些奶牛之间想要彼此通讯.在保证这些奶牛通讯的情况下,他想使用最少的光纤完成通信网构件工作.给出想要通讯的成对奶牛的清单,要求求出最少需使用多

3279 奶牛健美操

3279 奶牛健美操 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来,这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值,我们称之

codevs 3279 奶牛健美操

3279 奶牛健美操   USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond       题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来,这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值,我们称

CODEVS 3279 奶牛的健美操

3279 奶牛健美操 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来,这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值,我们称之为这个路径集合的直径

光纤通信(codevs 1955)

题目描述 Description 农民John 想要用光纤连通他的N (1 <= N <= 1,000)个牲口棚(编号1..N).但是,牲口棚位于一个大池塘边,他仅可以连通相邻的牲口棚.John不需要连通所有的牲口棚, 因为只有某些奶牛之间想要彼此通讯.在保证这些奶牛通讯的情况下,他想使用最少的光纤完成通信网构件工作.给出想要通讯的成对奶牛的清单,要求求出最少需使用多少根光纤. 输入描述 Input Description 第1行: 2个整数, n 和 p (想要通讯的奶牛对数, 1<=

poj2112 Optimal Milking --- 最大流,二分

nx个挤奶器,ny头奶牛,每个挤奶器最多能供m头奶牛使用. 现给出nx+ny之间的距离矩阵,求使得全部奶牛都到某个挤奶器挤奶所走的路程中,单个奶牛所走的最大路程的最小值. 开始感觉这个类似二分图匹配,不同之处在于挤奶器可以连接m个以内的奶牛,用网络流的模型是可以求出满足条件的解的. 问题是如何满足最大路程的最小值,这一种典型的二分的问法.. 所以我们二分答案,也就是枚举最大路程,直到求得最小值. 每次建边既添加所有最大路程以内的边,添加源点向每个挤奶器建边,容量为m,其他边都是1, 若返回的最大

1101

240pts 题目比较简单 有AK机会但是我放弃了.... 没开longlong 见祖宗..... A 草地排水 时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,256m 问题描述 [问题描述] 我们都知道,草地排水是一道简单的\(usaco\)网络流裸题.当然,网络流这么简单的知识点做这道题的各位大爷一定都很会做了.所以这道题和网络流并没有关系. 一场大雨过后,长春很多地势低洼的地方都被积水淹没了,\(everlasting\)家门口的草坪也不例外.脑小的\(everlas

USACO 奶牛食品(网络流)

题目大意: FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃.某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求.但是FJ又不愿意为此重新来做,所以他他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. FJ提供了F (编号为1.2.-.F)种食品并准备了D (编号为1.2.-.D)种饮料, 他的N头牛(编号为1.2.-.N)都已决定了是否愿意吃某种食物和喝某种饮料.FJ想给每一头牛一种食品和一种饮料,使得尽可

1861 奶牛的数字游戏 2006年USACO

codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶牛们的分数均为0.如果N是奇数,那么奶牛就会把它乘以3后再加1.如果N是偶数,那么这个数就会被除以2.数字每变动一次,这头奶牛就得到1分.当N的