1118. Birds in Forest (25)
并查集。。。要用路径压缩,不然会超时,
#include<iostream> #include<string> #include<map> #include<vector> #include<algorithm> #include<queue> #include<set> #include<stack> using namespace std; int father[10001]; int findf(int x) { int a =x; while (x != father[x]) { x = father[x]; } while (a != father[a]) { int z = a; a = father[a]; father[z] = x; } return x; } void Union(int a, int b) { int fa = findf(a); int fb = findf(b); if (fa != fb) { father[fa] = fb; } } int exist[10001]; int main() { int num; cin >> num; for (int i = 0; i < 10001; i++) { father[i] = i; } for (int i = 0; i < num; i++) { int n; cin >> n; int temp, pre = -1; for (int j = 0; j < n; j++) { cin >> temp; exist[temp] = 1; if (pre != -1) { Union(pre, temp); } pre = temp; } } int k = 1; while (exist[k] == 1) { k++; } k--; set<int> s; for (int i = 1; i <= k; i++) { s.insert(findf(i)); //cout << findf(i) << ' '; } cout << s.size()<<' '<<k<<endl; int a; cin >> a; for (int i = 0; i < a; i++) { int p, q; cin >> p >> q; if (findf(p) == findf(q)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } system("pause"); }
一定要记住这段。。。
                    
                
                
            
        
浙公网安备 33010602011771号