一句话题意:给出一个网络图,以及其源点和汇点,求出其网络最大流。
//Edmonds-Karp算法
//时间复杂度o(ve^2)
#include<bits/stdc++.h>
#define inf 999999
#define maxn 200000
using namespace std;
int n,m,s,t;
int ans=0;
struct Edge
{
int from,to,next,w,flow;
};
struct Edge edge[maxn];
int head[maxn],val[maxn],pre[maxn];
int cnt=0;
void add(int u,int v,int w)
{
edge[++cnt].to=v;
edge[cnt].from=u;
edge[cnt].flow=0;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
bool bfs()
{
queue<int> q;
int cnt=0;
memset(val,0,sizeof(val));
memset(pre,0,sizeof(pre));
val[s]=inf;//假设起点的可以的剩余流量无限大
pre[s]=0;//储存上一个节点
q.push(s);
while(!q.empty())
{
int j=q.front();q.pop();
for(int i=head[j];i;i=edge[i].next)
{
int v=edge[i].to;
if(!val[v]&&edge[i].w>edge[i].flow)//如果没有经过并且容量大于流量
{
q.push(v);
val[v]=min(val[j],edge[i].w-edge[i].flow);//剩余流量等于前一个节点的剩余流量与这条路的剩余流量的最小值
pre[v]=i;
}
}
if(val[t]) break;//循环到了t就跳出循环
}
return val[t];
}
int karp()
{
while(1)
{
if(!bfs()) break;
int Min=inf;
for(int i=t;i!=s;i=edge[pre[i]].from)
{
edge[pre[i]].flow+=val[t];
edge[((pre[i]-1)^1)+1].flow-=val[t];//如果是奇数+1
}
ans+=val[t];
}
}
int main()
{
int u,v,w;
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
add(u,v,w);//s->t存到2k-1
add(v,u,0);//t->s存到2k
}
karp();
cout<<ans<<endl;
return 0;
}
如有不足请提出,博主也刚刚学习,谢谢了~