题目大意
求最大流。(从原点到终点)每一条边都是单向边。
思路
刚学习Edmonds-Karp这种虽然低效但是好写的算法~~
现 学 现 卖
Edmonds-Karp是Ford-Fulkerson的BFS实现,核心有二:残留网络和反向路径。只要BFS能够搜到一条通路,那么就返回这条路径的流量,并加入最终的结果(Mflow)里面。
反正这种算法也是不能对付较大的图的,直接邻接矩阵搞定。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=205;
const int inf=1e9;
int n,m,g[maxn][maxn],pre[maxn];
int bfs(int s,int t)
{
queue<int>q;
q.push(s);
memset(pre,-1,sizeof(pre));
int i,flow[maxn];
flow[s]=inf,pre[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
if(u==t) break;
for(i=1;i<=m;i++)
{
if(i!=s&&g[u][i]>0&&pre[i]==-1)
{
pre[i]=u;
q.push(i);
flow[i]=min(flow[u],g[u][i]);
}
}
}
if(pre[t]==-1) return -1;
return flow[t];
}
int Maxflow(int s,int t)
{
int Mflow=0;
while(1)
{
int flow=bfs(s,t);
if(flow==-1) break;
int now=t;
while(now!=s)
{
int father=pre[now];
g[father][now]-=flow;
g[now][father]+=flow;
now=pre[now];
}
Mflow+=flow;
}
return Mflow;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int i;
memset(g,0,sizeof(g));
for(i=1;i<=n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u][v]+=w;
}
printf("%d\n",Maxflow(1,m));
}
return 0;
}