今年网络赛的一道题。问是否能分成两个完全图,转化为判断是否二分图。
关键在于建图上面。
如果两个人不是互相认识,那么一定处于不同集合,根据这点建图,也就是不是互相认识的人之间连边。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> #include<algorithm> #define MAXN 105 using namespace std; bool gl[MAXN][MAXN]; bool newgl[MAXN][MAXN]; int n; int col[MAXN]; bool dfs(int v,int c) { col[v]=c; for(int i=1; i<=n; ++i) if(newgl[v][i]) { if(col[v]==col[i]) return false; if(!col[i]&&!dfs(i,-c)) return false; } return true; } bool solve() { memset(col,0,sizeof(col)); for(int i=1; i<=n; ++i) if(!col[i]) { if(!dfs(i,1)) return false; } return true; } int main() { while(scanf("%d",&n)!=EOF) { memset(gl,0,sizeof(gl)); int v; for(int i=1; i<=n; ++i) { while(scanf("%d",&v)&&v) gl[i][v]=true; } memset(newgl,1,sizeof(newgl)); for(int i=1; i<=n; ++i) { newgl[i][i]=false; for(int j=1; j<=n; ++j) if(gl[i][j]==gl[j][i]&&gl[i][j]) newgl[i][j]=newgl[j][i]=false; } if(solve()) puts("YES"); else puts("NO"); } return 0; }