网络流/poj1273 Drainage Ditches

题意

  一个有向图,给出n个点,m条边,给出每条边的起点和中点以及容量,求最大流

分析

  求最大流模板

Accepted Code

dinic

 1 {

 2     PROBLEM:poj 1273

 3     AUTHER:Rinyo

 4     MEMO:网络流   

 5 }

 6 Program flow;

 7 Const

 8   Infile = 'flow.out';

 9   Outfile = 'flow.out';

10 Var       

11   q:Array[0..100000]Of Longint;

12   map:Array[0..400,0..400]Of Longint;

13   num:Array[0..400]Of Longint;

14   sum,i,n,m,x,y,w:Longint;

15   flag:Boolean;

16 

17 Function min(a,b:Longint):Longint;

18 Begin

19   If a<b Then min:=a Else min:=b;

20 End;

21 

22 Function dfs(now,value:Longint):Longint;

23 Var

24   v1,x,i:Longint;

25 Begin

26   If (now=n) Then Begin

27     dfs:=value;

28     Exit;

29   End;

30   v1:=value;

31   For i:=1 To n Do

32     If (map[now,i]>0) And (num[now]+1=num[i]) Then Begin

33       x:=dfs(i,min(value,map[now,i]));

34       value:=value-x;

35       Dec(map[now,i],x);

36       Inc(map[i,now],x);

37     End;

38   dfs:=v1-value;

39 End;

40 

41 Function bfs:Boolean;

42 Var

43   head,tail,now,i:Longint;

44 Begin

45   Fillchar(q,sizeof(q),0);

46   q[1]:=1;head:=0;tail:=1;flag:=false;

47   Fillchar(num,sizeof(num),0);

48   num[1]:=1;

49   While head<tail Do Begin

50     Inc(head);

51     now:=q[head];

52     For i:=1 To n Do

53       If map[now,i]>0 Then

54       If num[i]=0 Then Begin

55         Inc(tail);

56         q[tail]:=i;

57         num[i]:=num[now]+1;

58         If i=n Then begin

59           flag:=true;

60           Exit;

61         End;

62       End;

63   End;

64 End;

65 

66 Begin

67   Assign(input,infile);Reset(input);

68   Assign(output,outfile);Rewrite(output);

69   While not eof Do Begin

70     ReadLn(m,n);

71     Fillchar(map,sizeof(map),0);

72     For i:=1 To m Do begin

73       ReadLn(x,y,w);

74       map[x,y]:=map[x,y]+w;

75     End;

76     flag:=true;

77     sum:=0;

78     While flag Do Begin

79       bfs;

80       sum:=sum+dfs(1,maxlongint);

81     End;

82     WriteLn(sum);

83   End;

84   Close(input);Close(output);

85 End.

sap

  1 {

  2     PROBLEM:poj 1273

  3     AUTHER:Rinyo

  4     MEMO:网络流   

  5 }

  6 

  7 Program flow;

  8 Const

  9   Infile = 'flow.in';

 10   Outfile = 'flow.out';

 11 Var      

 12   maxflow,n,m,i,x,y,z:Longint;

 13   map,temp:Array[0..430,0..430]Of Longint;

 14   num,q,pre:Array[0..10000]Of Longint;

 15 

 16 Function min(a,b:Longint):Longint;

 17 Begin

 18   if a<b Then Exit(a) Else Exit(b);

 19 End;

 20 

 21 Procedure bfs;

 22 Var

 23   head,tail,i,now:Longint;

 24 Begin

 25   Fillchar(q,sizeof(q),0);

 26   q[1]:=n;head:=0;tail:=1;num[n]:=0;

 27   Fillchar(num,sizeof(num),0);

 28   While head<tail Do Begin

 29     Inc(head);

 30     now:=q[head];

 31     For i:=1 To n Do

 32       if (temp[now,i]>0) And (num[i]=0) Then Begin

 33         Inc(tail);

 34         q[tail]:=i;

 35         num[i]:=num[now]+1;

 36         if i=n Then Exit;

 37       End;

 38   End;

 39 End;

 40 

 41 Function findallowed(i:Longint):Longint;

 42 Var

 43   j:Longint;

 44 Begin

 45   For j:=1 To n Do

 46     If (map[i,j]>0) And (num[i]=num[j]+1) Then Exit(j);

 47   Exit(-1);

 48 End;

 49 

 50 Function relable(i:Longint):Longint;

 51 Var

 52   t,j:Longint;

 53 Begin

 54   t:=maxlongint;

 55   For j:=1 To n Do

 56     if map[i,j]>0 Then t:=min(t,num[j]+1);

 57   If t=maxlongint Then Exit(n) Else Exit(t);

 58 End;

 59 

 60 Function sap:Longint;

 61 Var

 62   i,j,ll,x:Longint;

 63 Begin

 64   maxflow:=0;i:=1;

 65   While (num[1]<n) Do Begin

 66     j:=findallowed(i);

 67     If (j>=0) Then Begin

 68       pre[j]:=i;i:=j;

 69       If (i=n) Then Begin

 70         ll:=maxlongint;

 71         i:=n;

 72         While i<>1 Do BEgin

 73           ll:=min(ll,map[pre[i],i]);

 74           i:=pre[i];

 75         End;

 76         i:=n;

 77         While i<>1 Do Begin

 78           map[pre[i],i]:=map[pre[i],i]-ll;

 79           map[i,pre[i]]:=map[i,pre[i]]+ll;

 80           i:=pre[i];

 81         End;

 82         maxflow:=maxflow+ll;

 83       End;

 84     End Else Begin

 85       x:=relable(i);

 86       num[i]:=x;

 87       While i<>1 Do i:=pre[i];

 88     End;

 89   End;

 90 End;

 91 

 92 Begin

 93   Assign(input,infile);Reset(input);

 94   Assign(output,outfile);Rewrite(output);

 95   While not eof Do begin

 96     Fillchar(map,sizeof(map),0);

 97     Fillchar(temp,sizeof(temp),0);

 98     Fillchar(pre,sizeof(pre),$ff);

 99     Fillchar(num,sizeof(num),0);

100     ReadLn(m,n);

101     For i:=1 To m Do Begin

102       ReadLn(x,y,z);

103       map[x,y]:=map[x,y]+z;

104       temp[y,x]:=temp[y,x]+z;

105     End;

106     bfs;

107     sap;

108     WriteLn(maxflow);

109   End;

110   Close(input);Close(output);

111 End.

 

你可能感兴趣的:(poj)