题目:洛谷P2756。
题目大意:有m个外籍飞行员和n个英国飞行员,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。现在一架飞机要一名外籍飞行员和一名英国飞行员开,且他们必须有默契,求一次最多能开出多少飞机。
解题思路:明显二分图匹配,我用的匈牙利算法(当然网络流也可以,只不过代码量会大一点)。
C++ Code:
#include<bits/stdc++.h> using namespace std; int m,n,s; bool b[105][105],used[105]; int lft[105]; int dfs(int u){ for(int i=1;i<=n;++i) if(b[u][i]&&!used[i]){ used[i]=true; if(lft[i]==0||dfs(lft[i])){ lft[i]=u; return 1; } } return 0; } void pipei(){ s=0; memset(lft,0,sizeof(lft)); for(int i=1;i<=m;++i){ memset(used,0,sizeof(used)); s+=dfs(i); } } int main(){ scanf("%d%d",&m,&n); int u,v; while(scanf("%d%d",&u,&v)&&u+v>0)b[u][v-m]=true; pipei(); printf("%d ",s); for(int i=1;i<=n;++i) if(lft[i]!=0)printf("%d %d ",lft[i],i+m); return 0; }