今天晚上学的最大流为了不忘记赶紧发一波,加深一下印象
#include<bits/stdc++.h>
#define inf 999999999
using namespace std;
const int maxn = 1010;
int rong[510][510],liu[510][510];//流量数组。容量数组
int p[maxn];//残流数组(保存残余流量的)
int m,n;
int pre[maxn];//前驱节点数组,方便查询前驱节点更新流量
int sum;
int begin,end;
void internet(){
queue<int> q;
while(1){
memset(p,0,sizeof(p));
p[begin]=inf;
q.push(begin);
while(!q.empty()){//bfs遍历所有增广路,一次只能遍历一条
int ans=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(!p[i]&&liu[ans][i]<rong[ans][i]){//该路径上的容量》流量才能流,并且该点没有访问过
p[i]=min(p[ans],rong[ans][i]-liu[ans][i]);//在ans-》i这两个节点中的残流和容量-流量选个小的值(一开始没有残流赋值inf)
pre[i]=ans;//保存前驱节点
q.push(i);
}
}
}
if(!p[end]){//如果该路径所有增广路都被访问了,则下一次访问不到汇点,又每次清零了残流数组,所以这时直接退出
break;
}
sum+=p[end];//更新答案
int tmp=end;
while(pre[tmp]){//更新流量
liu[pre[tmp]][tmp]+=p[end];//更新已占用流量
liu[tmp][pre[tmp]]-=p[end];//更新反向流量,用来后悔的,这个还没学明天再看看
tmp=pre[tmp];
}
}
}
int main(){
int i,j,k;
int x,y,z;
while(scanf("%d%d",&n,&m)!=EOF){
scanf("%d%d",&begin,&end);
sum=0;
memset(pre,0,sizeof(pre));
memset(rong,0,sizeof(rong));
memset(liu,0,sizeof(liu));
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
rong[x][y]+=z;
}
internet();
printf("%d\n",sum);
}
return 0;
}
刘汝佳大佬模板
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e4;
struct edge{
int from,to,flow,cap;
edge(int u,int v,int f,int c):from(u),to(v),flow(f),cap(c){}
};
struct ek{
int s,t;
vector<edge>edges;//存边
vector<int>G[maxn];//存邻接表
int p[maxn];//存储残流
int pre[maxn];//存储上一流量
void add(int u,int v,int w){
edges.push_back(edge(u,v,0,w));
edges.push_back(edge(v,u,0,0));
int m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
int maxflow(int s,int t){
int flow=0;
while(1){
queue<int>st;
memset(p,0,sizeof(p));
p[s]=inf;
st.push(s);
while(!st.empty()){
int ans=st.front();st.pop();
for(int i=0;i<G[ans].size();i++){
edge& e=edges[G[ans][i]];
if(!p[e.to]&&e.cap>e.flow){
p[e.to]=min(p[ans],e.cap-e.flow);
pre[e.to]=G[ans][i];
st.push(e.to);
}
}
if(p[t])break;
}
if(!p[t])break;
for(int u=t;u!=s;u=edges[pre[u]].from){
edges[pre[u]].flow+=p[t];
edges[pre[u]^1].flow-=p[t];
}
flow+=p[t];
}
return flow;
}
};
int main()
{
int n,m,s,t,x,y,z;
ek e2;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
e2.add(x,y,z);
}
cout<<e2.maxflow(s,t)<<endl;;
}