poj 1273 Drainage Ditches

模板水题一枚。

题意:Farmer建了水渠排水,并且控制了每条水渠的上限。求最大流。

贴个代码意思意思吧。

View Code
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<iostream>
  6 using namespace std;
  7 #define N 210
  8 #define M 210
  9 #define INF 0x7ffffff
 10 
 11 struct E{
 12     int v,c,next;
 13  }e[N*N<<2];
 14  
 15 int tol,head[N];
 16 
 17 void Init()
 18 {
 19     tol=0;
 20     memset(head,-1,sizeof(head));
 21 }
 22 
 23 void Add(int s,int t,int c)
 24 {
 25     e[tol].v=t;
 26     e[tol].c=c;
 27     e[tol].next=head[s];
 28     head[s]=tol++;
 29     
 30     e[tol].v=s;
 31     e[tol].c=0;
 32     e[tol].next=head[t];
 33     head[t]=tol++;
 34 }
 35 
 36 int gap[N];                                                                   
 37 int dis[N];                                                                     
 38 int pre[N];                                                                     
 39 int cur[N];                                                                    
 40 
 41 int Sap(int s,int t,int n)                                                  
 42 {
 43     int i;
 44     for(i=0;i<=n;i++)
 45     {
 46         dis[i]=gap[i]=0;
 47         cur[i]=head[i];
 48     }
 49     gap[0]=n;
 50     int u=pre[s]=s,maxf=0,aug=INF,v;
 51     while(dis[s]<n)
 52     {
 53 loop:   for(i=cur[u];i!=-1;i=e[i].next)
 54         {
 55             v=e[i].v;
 56             if(e[i].c>0&&dis[u]==dis[v]+1){
 57                 aug=min(aug,e[i].c);
 58                 pre[v]=u;
 59                 cur[u]=i;
 60                 u=v;
 61                 if(u==t){
 62                     while(u!=s)
 63                     {
 64                         u=pre[u];
 65                         e[cur[u]].c-=aug;
 66                         e[cur[u]^1].c+=aug;
 67                     }
 68                     maxf+=aug;
 69                     aug=INF;
 70                 }
 71                 goto loop;
 72             }
 73         }
 74         int min=n;
 75         for(i=head[u];i!=-1;i=e[i].next)
 76         {
 77             v=e[i].v;
 78             if(e[i].c>0&&dis[v]<min){
 79                 min=dis[v];
 80                 cur[u]=i;
 81             }
 82         }
 83         if(!(--gap[dis[u]]))
 84             break;
 85         ++gap[dis[u]=min+1];
 86         u=pre[u];
 87     }
 88     return maxf;
 89 }
 90 int main()
 91 {
 92     int n,m,i,st,ed;
 93     int a,b,c;
 94     while(scanf("%d%d",&m,&n)!=EOF)
 95     {
 96         st=1;
 97         ed=n;
 98         Init();
 99         for(i=0;i<m;i++)
100         {
101             scanf("%d%d%d",&a,&b,&c);
102             Add(a,b,c);
103         }
104         printf("%d\n",Sap(st,ed,n));
105     }
106     return 0;
107 }

 

posted @ 2013-04-29 16:36  Thousand Sunny  阅读(200)  评论(0编辑  收藏  举报