HDU4751 Divide Groups---bfs

来源:互联网 发布:树形结构数据库设计 编辑:程序博客网 时间:2024/05/16 18:56

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 0x3f3f3f3ftypedef __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;}


原创粉丝点击