并查集。。。要用路径压缩,不然会超时,
#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");}
一定要记住这段。。。