HDOJ4751 Divide Groups 模拟

来源:互联网 发布:mac 文件打包命令 编辑:程序博客网 时间:2024/04/30 14:32

倒过来做,把不认识的人分开就OK,直接模拟就行。

#include<iostream>#include<queue>#include<stdio.h>#include<string>#include<string.h>#include<algorithm>#include<vector>using namespace std;vector<int> map[110];vector<int> vep[110];int sss[110][110];int n,used[110];int main(){    int i,j,k;    while (scanf("%d",&n)!=EOF)    {        memset(sss,0,sizeof(sss));        for (i=1;i<=n;i++)        {            map[i].clear();            vep[i].clear();        }        for (i=1;i<=n;i++)        {            while (scanf("%d",&j)&&j){                map[i].push_back(j);                sss[i][j]=1;            }            for (k=1;k<=n;k++)            {                int tag=0;                for (j=0;j<map[i].size();j++)                    if (map[i][j]==k) tag=1;                if (!tag&&k!=i) vep[i].push_back(k);            }        }        for (i=1;i<=n;i++)        {            memset(used,0,sizeof(used));            used[i]=1;            for (j=0;j<vep[i].size();j++)                used[vep[i][j]]=2;            for (j=1;j<=n;j++)            {                if (used[j]==1)                    {for (k=0;k<vep[j].size();k++)                        if (used[vep[j][k]]==1) goto A; else used[vep[j][k]]=2;}                if (used[j]==2)                    {for (k=0;k<vep[j].size();k++)                        if (used[vep[j][k]]==2) goto A; else used[vep[j][k]]=1;}                if (used[j]==0)                {                    int tag=1;                    for (k=0;k<vep[j].size();k++)                        if (used[vep[j][k]]==2) tag=2;                    if (tag==2)                    {                        used[j]=1;                        for (k=0;k<vep[j].size();k++)                            if (used[vep[j][k]]==1) goto A; else used[vep[j][k]]=2;                    }                    else                    {                        used[j]=2;                        for (k=0;k<vep[j].size();k++)                            if (used[vep[j][k]]==2) goto A; else used[vep[j][k]]=1;                    }                }            }            for (j=1;j<=n;j++)            {                for (k=1;k<=n;k++)                {                    if (used[k]==used[j]&&sss[j][k]==0&&j!=k) goto A;                }            }            printf("YES\n");            break;            A: ;        }        if (i==n+1) printf("NO\n");    }    return 0;}/*52 3 01 3 01 2 4 03 5 03 4 062 3 4 5 6 01 3 4 01 2 4 01 2 3 02 6 04 5 062 3 4 5 6 01 4 01 2 4 01 2 3 02 6 04 5 0*/


原创粉丝点击