给你一个无向图, 让你判断这是不是一个二分图。
二分图的标准:可以把这个图的点分成两堆,试每条边都连接这两个堆里的点,而一个堆里的点不能相连。
无向图G为二分图的充分必要条件是,G至少有两个顶点, 且其所有回路的长度均为偶数。(???什么意思???)
语文不好,看图吧。
就这个意思。
而现在然你自己判断该怎么判断。
——看代码就能看懂
1 #include <cstdio> 2 #include <cstring> 3 4 int n, e, cnt; 5 int head[1001], next[1001], to[1001], color[1001]; 6 7 void add(int x, int y) 8 { 9 to[cnt] = y; 10 next[cnt] = head[x]; 11 head[x] = cnt++; 12 } 13 14 bool dfs(int u, int c) 15 { 16 int i, v; 17 color[u] = c; 18 for(i = head[u]; i != -1; i = next[i]) 19 { 20 v = to[i]; 21 if(color[v] == c) return 0; 22 if(color[v] == 0 && !dfs(v, -c)) return 0; 23 } 24 return 1; 25 } 26 27 bool solve() 28 { 29 int i; 30 for(i = 1; i <= n; i++) 31 if(color[i] == 0 && !dfs(i, 1)) 32 return 0; 33 return 1; 34 } 35 36 int main() 37 { 38 int i, x, y; 39 scanf("%d %d", &n, &e); 40 memset(head, -1, sizeof(head)); 41 for(i = 1; i <= e; i++) 42 { 43 scanf("%d %d", &x, &y); 44 add(x, y); 45 add(y, x); 46 } 47 if(solve()) printf("YES"); 48 else printf("NO"); 49 return 0; 50 }
时间: 2024-10-22 18:50:31