题解:
二分图判断
建立原图的补图
判断是否是二分图
代码:
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int N=105; int an[N],ans,a[N][N],n,x; void dfs(int x,int y) { if (ans)return; an[x]=y; for (int i=1;i<=n;i++) if ((!a[x][i]||!a[i][x])&&i!=x) { if (an[i]&&3-y!=an[i]){ans=1;return;} if (!an[i])dfs(i,3-y); } } int main() { while (~scanf("%d",&n)) { ans=0; memset(an,0,sizeof an); memset(a,0,sizeof a); for (int i=1;i<=n;i++) for (scanf("%d",&x);x;scanf("%d",&x))a[i][x]=1; for (int i=1;i<=n;i++) if (!an[i])dfs(i,1); if (ans)puts("NO");else puts("YES"); } }