HDU4751 Divide Groups-bfs
HDU4751 Divide Groups---bfs
e[i][j]表示两个人认不认识
vis=1或0 表示分在哪个组
枚举所有点作为起点 分在1组内 然后bfs啦
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f typedef __int64 ll; using namespace std; int n,e[110][110],vis[110]; int bfs(int x) { int i,u; vis[x]=1; queue<int>q; q.push(x); while(!q.empty()) { u=q.front(); q.pop(); for(i=1;i<=n;i++) { if(!e[u][i]&&u!=i)//判断不认识的人是不是已经分组 如果分在一组就直接退出 否则分在另外一组 { if(vis[i]==-1) { vis[i]=1-vis[u]; q.push(i); } else if(vis[i]==vis[u]) return 0; } } } return 1; } int main() { int i,j,x; while(~scanf("%d",&n)) { memset(e,0,sizeof e); memset(vis,-1,sizeof vis); for(i=1;i<=n;i++) { while(scanf("%d",&x)&&x) { e[i][x]=1; } } for(i=1;i<=n;i++)//改成无向图 { for(j=1;j<=n;j++) if(!e[i][j]) e[j][i]=0; } for(i=1;i<=n;i++) { if(vis[i]==-1&&!bfs(i)) { printf("NO\n"); break; } } if(i>n) printf("YES\n"); } return 0; }