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