HDU - 5971Wrestling Match 染色二分图

tech2023-06-11  95

题目链接: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"); } }
最新回复(0)