NYOJ 239-月老的难题(二分图)

题目描述:

月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘。

现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭。

现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸福的家庭,月老准备促成尽可能多的幸福家庭,请你帮他找出最多可能促成的幸福家庭数量吧。

假设男孩们分别编号为1~n,女孩们也分别编号为1~n。

输入描述:

第一行是一个整数T,表示测试数据的组数(1<=T<=400)
每组测试数据的第一行有两个整数n,K,其中男孩的人数与女孩的人数都是n。(n<=500,K<=10 000)
随后的K行,每行有两个整数i,j表示第i个男孩与第j个女孩有可能结成幸福的家庭。(1<=i,j<=n)

输出描述:

对每组测试数据,输出最多可能促成的幸福家庭数量

样例输入:

复制

1
3 4
1 1
1 3
2 2
3 2

样例输出:

2

第一次接触二分图,百度才知道用匈牙利算法,记下来。

还有,图论学着心好累啊啊啊啊!!!!!!!!!

头大!!!!!!!!!!!!!!!

弱鸡瑟瑟发抖||.-.||

附上大佬匈牙利算法的详解:https://blog.csdn.net/dark_scope/article/details/8880547

#include
#include
#include
#include
#define MAXN 510
using namespace std;
int t ,n ,k ,a ,b ,cont;
vector match[MAXN];
bool vis[MAXN];
int mat[MAXN];

bool dfs(int k){
	for(int i = 0; i < match[k].size(); i++){
		int temp = match[k][i];
		if(!vis[temp]){
			vis[temp] = true;
			if(!mat[temp] || dfs(mat[temp])){
				mat[temp] = k;
				return true;
			}
		}
	}
	return false;
}

int main(){
	scanf("%d",&t);
	while(t--){
		cont = 0;
		memset(mat,0,sizeof(mat));
		scanf("%d%d" ,&n ,&k);
		while(k--){
			scanf("%d%d",&a,&b);
			match[a].push_back(b);
		}
		for(int i = 1; i <= n; i++){
			memset(vis,0,sizeof(vis));
			if(dfs(i))	cont++;
		}
		for(int i = 0; i <= n; i++){
			match[i].clear() ;
		}
		printf("%d\n" ,cont);
	}
	return 0;
}

 

你可能感兴趣的:(学习,DFS,二分图)