

























啥也不说了 最大流 注意重边
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
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。