DFS写法123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include<iostream>#include<cstring>using namespace std;const int N = 100000 + 10;int h[N], e[2 * N], idx, ne[2 * N];int n, m;int st[N];void add(int a, int b){ e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;}bool dfs(int x, int c){ // c表示的是当前的颜色 st[x] = c; for(int i = h[x]; i != -1; i = ne[i]) { int d = e[i]; if(st[d] == 0) // 如果没有被染色 { if(!dfs(d,3 - c)) return false; } if(st[d] == c) // 如果连接的点的颜色等于当前点的颜色,则不是二分图 return false; } return true;}int main(){ memset(h, -1, sizeof h); cin >> n >> m; while(m--) { int a, b; cin >> a >> b; add(a,b); add(b,a); } // 分别遍历所有没有遍历过的点,有可能二分图不是连通图 bool ret = true; for(int i = 1; i <= n; i++) { if(st[i] == 0) { if(!dfs(i,1)) { ret = false; break; } } } if(ret) cout << "Yes"; else cout << "No"; return 0;} BFS写法12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N = 200010;int h[N], e[N], ne[N], st[N], idx;int n, m;void add(int a, int b){ e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}bool bfs(int o){ queue<int> q; q.push(o); int flag = 1; st[o] = flag; while(q.size()) { // 每次修改flag状态 int t = q.size(); flag = 3 - flag; // 按层遍历 for(int i = 0 ; i < t; i++) { auto p = q.front(); q.pop(); for(int j = h[p]; j != -1; j = ne[j]) { int p2 = e[j]; if(!st[p2]) { st[p2] = flag; q.push(p2); } // 重边也要判断 else if(p == p2 || st[p2] != flag) { return false; } } } } return true;}int main(){ cin >> n >> m; memset(h, -1, sizeof h); for(int i = 0 ; i< m ; i++) { int a, b; cin >> a >> b; add(a,b); add(b,a); } bool flag = bfs(1); for(int i = 1; i <= n; i++) { if(!st[i]) flag = flag && bfs(i); } if(flag)cout << "Yes"; else cout << "No"; return 0;}