題目鏈接點擊打開鏈接
直接套模板就好了,如果求二分圖的最大匹配的話可以設置一個超級原點和超級匯點把容量設爲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));
}
}