题目:BZOJ1191。
题目大意:有n个计策m道题目,通过一道才能做下一道,每道题目可以用指定的两个计策中的一个解决,每个计策只能用一次,求最多能通过多少题。
解题思路:此题是一道二分图匹配,用匈牙利算法即可。注意必须通过一道才能做下一道,所以当匹配失败时直接输出结果。当然如果全匹配成功也要输出结果。
C++ Code:
#include<cstdio> #include<vector> #include<cstring> using namespace std; vector<int>G[1024]; bool vis[1024]; int p[1024]; int n,m; bool dfs(int u){ for(int i=0;i<G[u].size();++i){ int v=G[u][i]; if(!vis[v]){ vis[v]=true; if(!p[v]||dfs(p[v])){ p[v]=u; return true; } } } return false; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ int x,y; scanf("%d%d",&x,&y); G[i].push_back(x); G[i].push_back(y); } memset(p,0,sizeof p); for(int i=1;i<=m;++i){ memset(vis,0,sizeof vis); if(!dfs(i)){//匹配失败,直接退出 printf("%d ",i-1); return 0; } } printf("%d ",m); return 0; }