poj1273(EK模版)

 1 //poj 1273
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <queue>
 6 
 7 using namespace std;
 8 #define MAXN 202
 9 #define inf 0x7ffffff
10 #define Min(x,y) (x>y?y:x)
11 int n;//顶点数
12 int flow[MAXN][MAXN];//残量网络
13 int maxflow;//最大流
14 int st,en;//源点,汇点
15 int a[MAXN];//a[v]表示s-v的最小残量
16 int cap[MAXN][MAXN];//容量限制
17 int pre[MAXN];//记录父亲
18 
19 int EK()
20 {
21     queue<int>q;
22     memset(flow,0,sizeof(flow));//初始时残量网络为0
23     maxflow=0;
24     while(1)
25     {
26         memset(a,0,sizeof(a));
27         a[st]=inf;
28         q.push(st);
29         while(!q.empty())
30         {
31             int u=q.front();q.pop();
32             for(int v=1;v<=n;v++)
33                 if(!a[v] && cap[u][v]>flow[u][v])//找到新节点v
34                 {
35                     pre[v]=u;q.push(v);
36                     a[v]=Min(a[u],cap[u][v]-flow[u][v]);
37                 }
38         }
39         if(a[en]==0) break;//找不到,则当前流已经是最大
40         for(int u=en;u!=st;u=pre[u])//从汇点往回走
41         {
42             flow[pre[u]][u]+=a[en];
43             flow[u][pre[u]]-=a[en];
44         }
45         maxflow+=a[en];
46     }
47     return maxflow;
48 }
49 
50 int main()
51 {
52     int m;
53     while(~scanf("%d%d",&m,&n))
54     {
55         memset(cap,0,sizeof(cap));
56         int u,v,c;
57         while(m--)
58         {
59             scanf("%d%d%d",&u,&v,&c);
60             cap[u][v]+=c;
61         }
62         st=1;
63         en=n;
64         printf("%d\n",EK());
65     }
66     return 0;
67 }
posted @ 2012-10-22 22:22  Missa  阅读(213)  评论(0编辑  收藏  举报