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;}