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 }

你可能感兴趣的:(poj)