算法总结—最大流

题目链接点击打开链接

直接套模板就好了,如果求二分图的最大匹配的话可以设置一个超级原点和超级汇点把容量设为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));
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值