[bzoj3396] [Usaco2009 Jan]Total flow 水流
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj3396] [Usaco2009 Jan]Total flow 水流相关的知识,希望对你有一定的参考价值。
题面解释了半天最大流。。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=59; 7 struct zs{ 8 int too,pre,flow; 9 }e[1523];int tot,last[maxn]; 10 int dis[maxn],dl[maxn]; 11 int i,j,k,n,m,s,t; 12 13 int ra;char rx; 14 inline int read(){ 15 rx=getchar(),ra=0; 16 while(rx<‘0‘||rx>‘9‘)rx=getchar(); 17 while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra; 18 } 19 inline bool bfs(){ 20 memset(dis,0,59<<2); 21 int l=0,r=1,i,now;dl[1]=s,dis[s]=1; 22 while(l<r&&!dis[t]) 23 for(i=last[now=dl[++l]];i;i=e[i].pre)if(e[i].flow&&!dis[e[i].too]) 24 dis[e[i].too]=dis[now]+1,dl[++r]=e[i].too; 25 return dis[t]; 26 } 27 inline int min(int a,int b){return a<b?a:b;} 28 int dfs(int x,int mx){ 29 if(x==t)return mx; 30 int i,used=0,w; 31 for(i=last[x];i;i=e[i].pre)if(e[i].flow&&dis[e[i].too]==dis[x]+1){ 32 w=dfs(e[i].too,min(mx-used,e[i].flow));if(w){ 33 e[i].flow-=w,e[i^1].flow+=w,used+=w; 34 if(used==mx)return mx; 35 } 36 } 37 dis[x]=0;return used; 38 } 39 inline void insert(int a,int b,int c){ 40 e[++tot].too=b,e[tot].flow=c,e[tot].pre=last[a],last[a]=tot, 41 e[++tot].too=a,e[tot].flow=0,e[tot].pre=last[b],last[b]=tot; 42 } 43 int main(){ 44 m=read();s=0,t=25,tot=1;char a[2],b[2]; 45 for(i=1;i<=m;i++) 46 scanf("%s%s",a,b),insert(a[0]-‘A‘,b[0]-‘A‘,read()); 47 int ans=0; 48 while(bfs())ans+=dfs(s,1002333333); 49 printf("%d\\n",ans); 50 }
以上是关于[bzoj3396] [Usaco2009 Jan]Total flow 水流的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 3396: [Usaco2009 Jan]Total flow 水流最大流
bzoj 1575: [Usaco2009 Jan]气象牛Baricdp
BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS
[BZOJ1575] [Usaco2009 Jan]气象牛Baric(DP)