emmm,输入坑,输出也坑。因为搞错了大小写,wa了4次。
记录一个坑点,不要只判断是否“成环”还要判断是不是所有的点都被连起来了
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 100100; int pre[N]; bool vis[N]; int find(int x){ int r = x; while(r != pre[r]) r = pre[r]; int i = x, j; while(i != r){ j = pre[i]; pre[i] = r; i = j; } return r; } void join(int x, int y){ int f1 = find(x), f2 = find(y); if(f1 != f2) pre[f2] = f1; } int main(){ int a, b; while(~ scanf("%d%d", &a, &b)){ if(a == 0 && b == 0){ cout << "Yes" << endl; continue ; } if(a == -1 && b == -1) break; for(int i = 1; i <= N; i ++) pre[i] = i; memset(vis, false, sizeof(vis)); vis[a] = vis[b] = true; join(a, b); int c, d; bool flag = false; int x = 0; while(scanf("%d%d", &c, &d)){ if(c == 0 && d == 0) break; vis[c] = vis[d] = true; if(find(c) == find(d)) flag = true; else{ join(c, d); x = c; } } int t = find(x); for(int i = 1; i <= N; i ++){ if(vis[i]){ if(find(i) != t) flag = true; } } if(flag) cout << "No" << endl; else cout << "Yes" << endl; } return 0; }