HDU 4751 Divide Groups(判断是否为二分图)
2015-04-02 11:27
423 查看
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <set> #define LL long long #define FOR(i, x, y) for(int i=x;i<=y;i++) using namespace std; const int MAXN = 100 + 10; struct Edge { int to; int next; }edge[MAXN*MAXN]; int head[MAXN]; int G[MAXN][MAXN]; int col[MAXN]; int tot; void AddEdge(int u, int v) { edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++; } void init() { tot = 0; memset(head, -1, sizeof(head)); } bool dfs(int u, int c) { col[u] = c; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].to; if(col[v] != -1) { if(col[v] == c) return false; } else if(!dfs(v, col[u]^1)) return false; } return true; } int main() { int n; while(scanf("%d", &n)!=EOF && n) { memset(G, 0, sizeof(G)); int t; FOR(i, 1, n) { while(scanf("%d", &t) && t) { G[i][t] = 1; } } init(); FOR(i, 1, n) { FOR(j, i + 1, n) { if(G[i][j] == 0 || G[j][i] == 0) { AddEdge(i, j); AddEdge(j, i); } } } memset(col, -1, sizeof(col)); int flag = 1; for(int i=1;i<=n;i++) { if(col[i] == -1 && dfs(i, 0) == false) { flag = 0; break; } } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- HDU 4751 Divide Groups(二分图判断)
- hdu 4751 Divide Groups (二分图判断)
- HDU 4751 Divide Groups (2013南京网络赛1004题,判断二分图)
- HDU 4751 Divide Groups(二分图的判断)
- HDU 4751 Divide Groups (判断二分图染色模板)
- HDU 4751 Divide Groups 二分图判断
- HDU 4751 Divide Groups(判断二分图)
- hdu 4751 Divide Groups(判完美二分图)
- HDU 4751 Divide Groups (二分图)
- hdu 4751 Divide Groups 二分图
- HDU 4751 Divide Groups【二分图染色】
- hdu 4751 Divide Groups (2-SAT or 补图+二分图判定)
- HDU 4751 Divide Groups 【判定二分图】
- HDU 4751 — Divide Groups 交叉染色判二分图
- HDU - 4751 Divide Groups(二分图)
- HDU - 4751 Divide Groups 二分图判定
- HDU-4751 Divide Groups 染色问题
- hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)
- hdu 4751 Divide Groups 2013 ACM/ICPC Asia Regional Nanjing Online
- HDU 2444 The Accomodation of Students(判断是否是二分图)