洛谷P3376 最大网络流模板

题目描述

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。输入输出格式输入格式:第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)输出格式:一行,包含一个正整数,即为该网络的最大流。

输入样例#1

4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40

输出样例#1:

50

解题思路

最大网络流模板题,使用Ford-Fulkerson算法。代码如下:

#include
#include
#include
#include
using namespace std;
const int MAXN = 1e4+10;
const int INF = 0x3f3f3f3f;

int n,m,s,t;	//分别代表点的个数、边数、源点、汇点 
struct edge{
	//终点、容量、反向边 
	int to,cap,rev;
	edge(){}
	edge(int to,int cap,int rev):to(to),cap(cap),rev(rev){}
};
vector G[MAXN];	//图的邻接表表示 
bool used[MAXN];		//dfs用标记数组
//向图中增加一条s到t,容量为cap的边 
void add_edge(int from,int to,int cap){
	G[from].push_back(edge(to,cap,G[to].size()));
	G[to].push_back(edge(from,0,G[from].size()-1));
} 
int dfs(int v,int t,int f){
	if(v == t) return f;
	used[v] = true;
	for(int i = 0;i < G[v].size();i++){
		edge &e = G[v][i];
		if(!used[e.to] && e.cap > 0){
			int d = dfs(e.to,t,min(f,e.cap));
			if(d > 0){
				e.cap -= d;
				G[e.to][e.rev].cap += d;
				return d;
			}
		}
	}
	return 0;
}
int maxFlow(int s,int t){
	int flow = 0;
	while(true){
		memset(used,0,sizeof used);
		int f = dfs(s,t,INF);
		if(!f) return flow;
		flow += f;
	}
}
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);	
	int u,v,w;
	for(int i = 0;i < m;i++){
		scanf("%d%d%d",&u,&v,&w);
		add_edge(u,v,w);
	}
	printf("%d\n",maxFlow(s,t));
	return 0;
}

你可能感兴趣的:(网络流)