hdu 3478 //判联通+二分图判定

来源:互联网 发布:淘宝网火车票 编辑:程序博客网 时间:2024/04/26 19:49



#include<stdio.h>#include<string.h>const int N = 100010;struct NODE{    int v, next;}edge[510000 * 2];int clr[N], n, m;int head[N], e;void addedge(int u, int v){    edge[e].v = v;    edge[e].next = head[u];    head[u] = e++;}//cnt判断联通性,flag=0表示能二分着色int Clr_BFS(int s){    int qu[N], f = -1, r = -1;    int pos, tmp, cnt = 1, flag = 0;    clr[s] = 1;    qu[++r] = s;    while(f != r)    {        pos = qu[++f];        for(int p = head[pos]; p != -1; p = edge[p].next)        {            tmp = edge[p].v;            if(clr[tmp] == clr[pos])            {                flag = 1; //return 0; //fail                continue;            }            if(clr[tmp] == -1)            {                cnt++;                clr[tmp] = clr[pos] ^ 1;                qu[++r] = tmp;            }        }    }    if(cnt == n && flag)        return 1;    else return 0;}int main(){    int t, i, a, b, s, ca = 0;    scanf("%d", &t);    while(t--)    {        e = 0;        memset(clr, -1, sizeof(clr));        memset(head, -1, sizeof(head));        scanf("%d%d%d", &n, &m, &s);        for(i = 0; i < m; i++)        {            scanf("%d%d", &a, &b);            addedge(a, b);            addedge(b, a);        }        printf("Case %d: ", ++ca);        if(Clr_BFS(s))        {            printf("YES\n");        }        else printf("NO\n");    }    return 0;}


原创粉丝点击