pku 1273
啥也不说了 最大流 注意重边
1
#include <iostream>
2
using namespace std;
3
4
//求网络最大流,邻接阵形式
5
//返回最大流量,flow返回每条边的流量
6
//传入网络节点数n,容量mat,源点source,汇点sink
7
8
#define MAXN 210
9
#define inf 2110000000
10
11
int max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){
12
int pre[MAXN],que[MAXN],d[MAXN],p,q,t,i,j;
13
if (source==sink) return inf;
14
for (i=0;i<n;i++)
15
for (j=0;j<n;flow[i][j++]=0);
16
for (;;){
17
for (i=0;i<n;pre[i++]=0);
18
pre[t=source]=source+1,d[t]=inf;
19
for (p=q=0;p<=q&&!pre[sink];t=que[p++])
20
for (i=0;i<n;i++)
21
if (!pre[i]&&(j=mat[t][i]-flow[t][i]))
22
pre[que[q++]=i]=t+1,d[i]=d[t]<j?d[t]:j;
23
else if (!pre[i]&&(j=flow[i][t]))
24
pre[que[q++]=i]=-t-1,d[i]=d[t]<j?d[t]:j;
25
if (!pre[sink]) break;
26
for (i=sink;i!=source;)
27
if (pre[i]>0)
28
flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;
29
else
30
flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;
31
}
32
for (j=i=0;i<n;j+=flow[source][i++]);
33
return j;
34
}
35
36
37
int mat[MAXN][MAXN],flow[MAXN][MAXN];
38
39
int n,m;
40
41
void init()
42
{
43
int i;
44
int f,t,c;
45
46
memset(mat,0,sizeof(mat));
47
48
for (i=0;i<m;i++)
49
{
50
scanf("%d%d%d",&f,&t,&c);
51
mat[f-1][t-1]+=c;
52
}
53
}
54
55
int main()
56
{
57
while (scanf("%d%d",&m,&n)==2)
58
{
59
init();
60
printf("%d\n",max_flow(n,mat,0,n-1,flow));
61
}
62
return 0;
63
}
64
65
#include <iostream>2
using namespace std;3

4
//求网络最大流,邻接阵形式5
//返回最大流量,flow返回每条边的流量6
//传入网络节点数n,容量mat,源点source,汇点sink7

8
#define MAXN 2109
#define inf 211000000010

11
int max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){12
int pre[MAXN],que[MAXN],d[MAXN],p,q,t,i,j;13
if (source==sink) return inf;14
for (i=0;i<n;i++)15
for (j=0;j<n;flow[i][j++]=0);16
for (;;){17
for (i=0;i<n;pre[i++]=0);18
pre[t=source]=source+1,d[t]=inf;19
for (p=q=0;p<=q&&!pre[sink];t=que[p++])20
for (i=0;i<n;i++)21
if (!pre[i]&&(j=mat[t][i]-flow[t][i]))22
pre[que[q++]=i]=t+1,d[i]=d[t]<j?d[t]:j;23
else if (!pre[i]&&(j=flow[i][t]))24
pre[que[q++]=i]=-t-1,d[i]=d[t]<j?d[t]:j;25
if (!pre[sink]) break;26
for (i=sink;i!=source;)27
if (pre[i]>0)28
flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;29
else30
flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;31
}32
for (j=i=0;i<n;j+=flow[source][i++]);33
return j;34
}35

36

37
int mat[MAXN][MAXN],flow[MAXN][MAXN];38

39
int n,m;40

41
void init()42
{43
int i;44
int f,t,c;45

46
memset(mat,0,sizeof(mat));47

48
for (i=0;i<m;i++)49
{50
scanf("%d%d%d",&f,&t,&c);51
mat[f-1][t-1]+=c;52
}53
}54

55
int main()56
{57
while (scanf("%d%d",&m,&n)==2)58
{59
init();60
printf("%d\n",max_flow(n,mat,0,n-1,flow));61
}62
return 0;63
}64

65



浙公网安备 33010602011771号