算法總結—最大流

題目鏈接點擊打開鏈接

直接套模板就好了,如果求二分圖的最大匹配的話可以設置一個超級原點和超級匯點把容量設爲1的有向圖,跑一次最大流即可。

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
//如果是無向圖,建圖時,把反向弧的容量設爲該邊的容量,然後跑一次最大流就ok了

int T,N,M;
typedef struct node {
	int to,rev;
	int cap;
}node;
const int MAXN=20;
const int INF=0x3f3f3f3f;
vector<node> mp[MAXN];
int vis[MAXN];

int dfs(int v,int t,int gf) {
	if(v==t) return gf;
	vis[v]=1;
	for(int i=0;i<mp[v].size();i++) {
		node fa=mp[v][i];
		if(vis[fa.to]==0&&fa.cap>0) {
			int d=dfs(fa.to,t,min(fa.cap,gf));
			mp[v][i].cap-=d;
			mp[fa.to][fa.rev].cap+=d;
			if(d>0) return d;
		}
	}
	return 0;
}

int maxflow(int s,int t) {
	int f=0;
	while(1) {
		for(int i=0;i<MAXN;i++) vis[i]=0;
		int sf=dfs(s,t,INF);
		if(sf==0) {
			return f;
		}
		f+=sf;
	}
}

int main() {
	scanf("%d",&T);
	for(int Case=1;Case<=T;Case++) {
		for(int i=0;i<MAXN;i++) mp[i].clear();
		scanf("%d%d",&N,&M);
		int x,y,c;
		for(int i=1;i<=M;i++) {
			scanf("%d%d%d",&x,&y,&c);
			node d;
			d.to=y,d.rev=mp[y].size(),d.cap=c;
			mp[x].push_back(d);
			d.to=x,d.rev=mp[x].size()-1,d.cap=0;
			mp[y].push_back(d);
		}
		printf("Case %d: %d\n",Case,maxflow(1,N));
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章