今天晚上学的最大流为了不忘记赶紧发一波,加深一下印象

#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;;
}