网络流 network

今天做数学试卷做到了一道题,很像网络流的最大流,于是就把EK学了qwq

先发个代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=0x7fffffff;
const int MaxN=1001;
int G[MaxN][MaxN];
int n,m,en;
int s,t;
int pre[MaxN],flw[MaxN];
int hd[MaxN];
inline int (int s,int t)
{
queue<int> Q;
memset(pre,-1,sizeof pre);
pre[s]=0;
Q.push(s);
flw[s]=INF;
while(!Q.empty())
{
int now=Q.front();
Q.pop();
if(now==t)
break;
for(int i=1;i<=n;++i)
if(G[now][i]>0&&pre[i]==-1)
pre[i]=now,flw[i]=min(flw[now],G[now][i]),Q.push(i);
}
return pre[t]==-1?-1:flw[t];
}
int EK(int s,int t)
{
int sum=0;
int maxflw=0;
while((sum=bfs(s,t))!=-1)
{
int k=t;
while(k!=s)
{
int lst=pre[k];
G[lst][k]-=sum;
G[k][lst]+=sum;
k=lst;
}
maxflw+=sum;
}
return maxflw;
}
int main(void)
{
int u,v,w;
scanf("%d %d %d %d",&n,&m,&s,&t);
for(int i=1;i<=m;++i)
scanf("%d %d %d",&u,&v,&w),G[u][v]+=w;
return printf("%d",EK(s,t)),0;
}

洛谷题号:P3376

EK最好用邻接矩阵,70pts