[HNOI2006]超级英雄Hero

题目: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;
}
原文地址:https://www.cnblogs.com/Mrsrz/p/7323760.html