ACM PKU 1273 Drainage Ditches

题目描述: http://poj.org/problem?id=1273

第一道最大网络流算法题,也是跟着老师写的

 1 #include <iostream>
2 using namespace std;
3 #define MAX 100000000
4 #define MAXN 205
5
6 int pre[MAXN+10],prem[MAXN+10];
7 int ecnt,box[MAXN];
8
9 struct node
10 {
11 int to,next,w;
12 }edge[MAXN*2];
13
14 void make_map(int from,int to,int w)
15 {
16 edge[ecnt].to=to;
17 edge[ecnt].w=w;
18 edge[ecnt].next=box[from];
19 box[from]=ecnt++;
20 }
21 bool bfs(int s,int t)
22 {
23 int que[MAXN],front=0,len=0;
24 que[len++]=s;
25 bool visit[MAXN];
26 memset(visit,0,MAXN);
27 visit[s]=true;
28 while(front!=len)
29 {
30 int a=que[front++];
31 for(int i=box[a];i+1;i=edge[i].next)
32 {
33 int v=edge[i].to;
34 if(!visit[v] && edge[i].w)
35 {
36 pre[v]=a;
37 prem[v]=i;
38 que[len++]=v;
39 visit[v]=true;
40 if(v==t)return true;
41 }
42 }
43 }
44 return false;
45 }
46 int EK(int s ,int t)
47 {
48 int ans=0;
49 while(bfs(s,t))
50 {
51 int d=MAX;
52 for(int i=t;i!=s;i=pre[i])
53 {
54 d=min(d,edge[prem[i]].w);
55 }
56 for(int i=t;i!=s;i=pre[i])
57 {
58 edge[prem[i]].w-=d;
59 edge[prem[i]^1].w+=d;
60 }
61 ans+=d;
62 }
63 return ans;
64 }
65
66 int main()
67 {
68 //freopen("in.txt","r",stdin);
69 int m,n;
70 while(scanf("%d%d",&m,&n)==2)
71 {
72 ecnt=0;
73 memset(box,-1,sizeof(box));
74 int x,y,k;
75 for(int i=0;i<m;i++)
76 {
77 scanf("%d%d%d",&x,&y,&k);
78 make_map(x,y,k);
79 make_map(y,x,0);
80 }
81 int ans=EK(1,n);
82 printf("%d\n",ans);
83 }
84 return 0;
85 }

  

posted on 2011-08-12 19:05  _Clarence  阅读(134)  评论(0编辑  收藏  举报

导航