C - Courses(二分图匹配)

C - Courses(二分图匹配)

题意:给定 n n 个结点,若干条边,问该图是否为完美二分匹配图。

思路:匈牙利算法直接秒掉。

时间复杂度: O ( n 3 ) O(n^3)

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=305;
int g[N][N],t,n,m,vis[N],mh[N];
void init(int n){
	for(int i=1;i<=n;i++)
		vis[i]=mh[i]=0;
	memset(g,0,sizeof g);
}
int find(int u){
	for(int i=1;i<=n;i++)
		if(g[u][i]&&!vis[i])
		{
			vis[i]=1;
			if(!mh[i]||find(mh[i]))
			{
				 mh[i]=u;
				 return 1;
			}
		}
	return 0;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&m,&n);
		init(n);
		for(int i=1;i<=m;i++)
		{
			int cnt;
			scanf("%d",&cnt);
			for(int j=1,x;j<=cnt;j++)
			{
				scanf("%d",&x);
				g[i][x]=1;
			} 
		}
		int num=0;
		for(int i=1;i<=m;i++)
		{
			 memset(vis,0,sizeof vis);
			 num+=find(i);
		}
		puts(num==m?"YES":"NO");
	}
	return 0;
}
原创文章 201 获赞 165 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/105935222