题目链接: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");
}
}