[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 }
View Code

 

以上是关于[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)

[BZOJ1574] [Usaco2009 Jan]地震损坏Damage(贪心 + dfs)

BZOJ1576 [Usaco2009 Jan]安全路经Travel