题意: 给一个集合的人和互相之间的关系 问 能不能将这个集合分成两个部分 每个集合之间的人都相互认识
判定二分图 染色判定
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 100 + 5;
bool Adj[maxn][maxn];
int color[maxn];
int n;
bool DFS(int cur,int f){
color[cur] = f;
for(int i = 1;i <= n;++i){
if(Adj[cur][i] && i != cur){
if(color[i] == -1){
if(!DFS(i,!f)) return false;
}
else if(color[i] == color[cur]) {return false;}
}
}
return true;
}
int temp;
int main(){
while(~sf("%d",&n)){
memset(Adj,0,sizeof(Adj));
memset(color,-1,sizeof(color));
for(int i = 1;i <= n;++i){
Adj[i][i] = 0;
while( sf("%d",&temp) && temp ){
Adj[i][temp] = 1;
}
}
for(int i = 1;i <= n;++i){
for(int j = i + 1;j <= n;++j){
if(Adj[i][j] && Adj[j][i]){
Adj[i][j] = Adj[j][i] = 0;
}else Adj[i][j] = Adj[j][i] = 1;
}
}
bool right = true;
for(int i = 1;i <= n & true;++i){
if(color[i] == -1){
right = right && DFS(i,1);
}
}
pf("%s\n",right ? "YES" : "NO");
}
return 0;
}