标签:二分图

3 3 0 1 0 1 2 0
YES
题意:n个人分成两个集合,要每一个图的认识关系都是完全图,是否可以分成
思路:先把不是相互认识的放在一个连接表联系起来,这些人必须不是一个集合的,然后染色法判断
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b) for(i = a; i < b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 105
vector<int>g[N];
int n,vis[N];
int a[N][N];
bool dfs(int x,int color)
{
int i;
vis[x]=color;
fre(i,0,g[x].size())
{
int to=g[x][i];
if(vis[to]!=-1)
{
if(vis[to]==color) return false; //不认识但是在一个集合
continue;
}
if(!dfs(to,!color)) //不认识就得在不同的集合
return false;
}
return true;
}
bool solve()
{
int i,j;
mem(vis,-1);
fre(i,1,n+1)
{
if(vis[i]==-1&&dfs(i,0)==false)
return false;
}
return true;
}
int main()
{
int i,j;
while(~sf(n))
{
fre(i,1,n+1)
g[i].clear();
int x;
mem(a,0);
fre(i,1,n+1)
{
while(sf(x),x)
{
a[i][x]=1;
}
}
fre(i,1,n+1)
fre(j,i+1,n+1)
if(a[i][j]==0||a[j][i]==0)
{
g[i].push_back(j);
g[j].push_back(i);
}
if(solve())
pf("YES\n");
else
pf("NO\n");
}
return 0;
}
HDU 4751 Divide Groups(二分图的判断)
标签:二分图
原文地址:http://blog.csdn.net/u014737310/article/details/44467523