hihocoder1121 二分图一•二分图判定

来源:互联网 发布:知乎每日精选 rss 编辑:程序博客网 时间:2024/06/15 11:31

染色(模拟)

题目传送门

图的染色(就是二分图判定的方法),思路题目上直接有就不讲了。
注意可能有多个联通分量。
贴上交了8遍才过的代码(还是8遍):

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 10000using namespace std;struct edge{    int to;    int next;};int k,t,n,m,u,v,r,w;edge a[MAXN*8+5];int h[MAXN+5];int f[MAXN+5];int b[MAXN*10+5];bool pd;void read(int x,int y){    k++;    a[k].next=h[x];    a[k].to=y;    h[x]=k;}void doit(int j){    b[1]=j; f[j]=1;    r=0; w=1; int x;    while (r<w)        {            x=b[++r];            if (f[x]==1)                for (int i=h[x];i!=0;i=a[i].next)                    {                        if (!f[a[i].to])                            {                                f[a[i].to]=2;                                b[++w]=a[i].to;                            }                         else                            if (f[a[i].to]==1)                                {                                    printf("Wrong\n");                                    pd=true;                                    return;                                }                    }            else                for (int i=h[x];i!=0;i=a[i].next)                    {                        if (!f[a[i].to])                            {                                f[a[i].to]=1;                                b[++w]=a[i].to;                            }                        else                            if (f[a[i].to]==2)                                {                                    printf("Wrong\n");                                    pd=true;                                    return;                                }                    }        }}int main(){    scanf("%d",&t);    while (t--)        {            memset(h,0,sizeof(h));            memset(f,0,sizeof(f));            k=0;            pd=false;            scanf("%d%d",&n,&m);            for (int i=1;i<=m;i++)                {                    scanf("%d%d",&u,&v);                    read(u,v);                    read(v,u);                }            for (int j=1;j<=n;j++)                {                    if (!f[j])                        doit(j);                    if (pd)                        break;                }            if (pd==false)                printf("Correct\n");        }    return 0;}
阅读全文
1 0
原创粉丝点击