HDU - 5971 Wrestling Match 染色二分图

题目链接:https://vjudge.net/problem/HDU-5971
题目大意:已知有n个人,他们进行了m场比赛,已知其中有X个好人,Y个坏人。比赛一定是在好人和坏人之间进行的。问是否能够把n个人划分成好人和坏人两个部分??

首先了解一下二分图:
在这里插入图片描述
二分图的定义:
简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。

可以看出:此题就是判断题中所给条件能否构成一个二分图。

代码详解:

#include<bits/stdc++.h>
using namespace std;
const int maxn=20005;
int q[maxn];
vector<int>v[maxn];
int dfs(int s)     
{
	for(int i=0;i<v[s].size();i++)
	{
		int x=v[s][i];
		if(q[x]==0)
		{
			q[x]=-q[s];     
			if(dfs(x)==0)
			{
				return 0;
			}
		}
		else if(q[x]==q[s])
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
    int n,m,x,y;
	while(~scanf("%d%d%d%d",&n,&m,&x,&y))
	{
		memset(q,0,sizeof(q));
		for(int i=0;i<maxn;i++)
		{
			v[i].clear();
		}
	   	 int a,b;
	   	 for(int i=0;i<m;i++)
	   	 {
	   	 	scanf("%d%d",&a,&b);
	   	 	v[a].push_back(b);
	   	 	v[b].push_back(a);
		 }
		 for(int i=0;i<x;i++)
		 {
		 	scanf("%d",&a);
		 	q[a]=1;
		 }
		 for(int i=0;i<y;i++)
		 {
		 	scanf("%d",&b);
		 	q[b]=-1;
		 }

		 int ans=1;
		 for(int i=1;i<=n;i++)
		 {
		 	if(q[i]!=0&&dfs(i)==0)
		 	{
		 		ans=0;
		 		break;
			 }
		 }
		 for(int i=1;i<=n;i++)
		 {
		 	if(q[i]==0)
		 	{
		 		q[i]=1;
		 		if(dfs(i)==0)
		 		{
		 			ans=0;
		 			break;
				 }
			 }
		 }
		 if(ans==1) printf("YES\n");
		 else printf("NO\n");
	}	
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值