题意:人与人之间可以认识或不认识,可以单向认识也可以双向认识,给你他们认识的关系,让你将他们分成两组,每组里面的任意两个人都认识。
转化一下,将双向认识的人之间不连边,单向认识或不认识的人连边,然后判二分图就行了。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; const int maxn=105; int maze[maxn][maxn]; int imap[maxn][maxn]; int color[maxn]; int n; bool fuck_dfs(int u,int f) { for(int i=1; i<=n; i++) { if(imap[u][i]==0||i==f) continue; if(color[u]==color[i]) return false; if(!color[i]) { color[i]=3-color[u]; if(!fuck_dfs(i,u)) return false; } } return true; } int main() { int a; while(~scanf("%d",&n)) { memset(maze,0,sizeof(maze)); for(int i=1; i<=n; i++) { while(scanf("%d",&a)) { if(a==0) break; maze[i][a]=1; } } memset(imap,0,sizeof(imap)); for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { if(maze[i][j]&&maze[j][i]) continue; imap[i][j]=imap[j][i]=1; } } int flag=0; memset(color,0,sizeof(color)); for(int i=1; i<=n; i++) { if(color[i]==0) { color[i]=1; if(!fuck_dfs(i,i)) { flag=1; break; } } } if(flag) printf("NO\n"); else printf("YES\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-16 16:35:59