明显的并查集题目,第一回写这类型的题目,居然只一次WA,就AC了,RP爆发啊!!! 算法我也不知道怎么说,O(∩_∩)O~ 等哪天真正学会最优的版本时再来写吧!!!! #include <iostream> using namespace std; int p[201]; int rank[201]; void MakeSet(int); void Union(int, int); void Link(int, int); int FindSet(int); void MakeSet(int x) { p[x] = x; rank[x] = 0; } void Union(int x, int y) { Link(FindSet(x), FindSet(y)); } void Link(int x, int y) { if(rank[x] > rank[y]) p[y] = x; else { p[x] = y; if(rank[x] == rank[y]) rank[y]++; } } int FindSet(int x) { if(x != p[x]) p[x] = FindSet(p[x]); return p[x]; } int a[201]; bool b[201]; int main() { int n, m; scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { MakeSet(i); a[i] = 0; b[i] = false; } int x, y, flag = 0; for(int i = 1; i <= m; i++) { scanf("%d %d", &x, &y); if(flag == 1) continue; if(FindSet(x) == FindSet(y)) flag = 1; if(a[x] == 0) a[x] = y; else Union(a[x], y); if(a[y] == 0) a[y] = x; else Union(a[y], x); } if(flag == 1) { cout << "no" << endl; return 0; } cout << "yes" << endl; int xx, t = 1; int c[201]; for(int i = 1; i <= n; i++) { if(b[i] == true) continue; c[t++] = i; b[i] = true; xx = FindSet(i); for(int j = i+1; j <= n; j++) { if(FindSet(j) == xx) { c[t++] = j; b[j] = true; } } if(a[i] == 0) continue; xx = FindSet(a[i]); for(int j = i+1; j <= n; j++) { if(FindSet(j) == xx) b[j] = true; } } cout << t-1 << endl; cout << c[1]; for(int i = 2; i < t; i++) cout << ' ' << c[i]; cout << endl; return 0; } 另一种解法,2-着色图,广搜 #include <iostream> #include <vector> using namespace std; vector<int> vec[2001]; int que[2001]; int res[2001]; int main() { int n, m; cin >> n >> m; for(int i = 1; i <= n; i++) { vec[i].clear(); res[i] = 0; } int x, y, flag = 0; for(int i = 1; i <= m; i++) { scanf("%d %d", &x, &y); if(flag) continue; if(x == y) { flag = 1; continue; } vec[x].push_back(y); vec[y].push_back(x); } int first, back, data; for(int i = 1; i <= n && !flag; i++) { if(res[i] != 0) continue; res[i] = 1; first = 1; back = 1; que[first++] = i; while(first != back && !flag) { data = que[back++]; for(int j = 0; j < vec[data].size(); j++) { if(res[vec[data][j]] == 0) { res[vec[data][j]] = res[data] * -1; que[first++] = vec[data][j]; } else { if(res[vec[data][j]] == res[data]) { flag = 1; break; } } } } } if(flag) { cout << "no" << endl; return 0; } int tot = 0; for(int i = 1; i <= n; i++) { if(res[i] == 1) tot++; } cout << "yes" << endl; cout << tot << endl; cout << 1; for(int i = 2; i <= n; i++) { if(res[i] == 1) cout << ' ' << i; } cout << endl; return 0; }