题目: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;
}