classUnionFind { public: vector<int> pre; vector<int> size; int count; UnionFind(int n) { count = n; pre.resize(n); size.resize(n, 1); for (int i = 0; i < n; i++) { pre[i] = i; } } intfind(int x) { if (pre[x] == x) return x; return pre[x] = find(pre[x]); } boolisconnect(int x, int y) { returnfind(x) == find(y); } boolconnect(int x, int y) { x = find(x); y = find(y); if (x == y) returnfalse; if (size[x] < size[y]) swap(x, y); pre[y] = x; size[x] += size[y]; count--; returntrue; } voiddisconnect(int x) { pre[x] = x; } }; classSolution { public: staticboolcmp(vector<int> &a, vector<int> &b) { return a[2] < b[2]; } vector<int> findAllPeople(int n, vector<vector<int>> &meetings, int firstPerson) { sort(meetings.begin(), meetings.end(), cmp); UnionFind uf(n); int m = meetings.size(); uf.connect(0, firstPerson); for (int i = 0; i < m; i++) { int j = i + 1; for (; j < m; j++) { if (meetings[i][2] != meetings[j][2]) break; }
for (int k = i; k < j; k++) { uf.connect(meetings[k][0], meetings[k][1]); } for (int k = i; k < j; k++) { if (!uf.isconnect(meetings[k][0], 0)) { uf.disconnect(meetings[k][0]); uf.disconnect(meetings[k][1]); } } i = j - 1; } vector<int> ret; for (int i = 0; i < n; i++) { if (uf.isconnect(i, 0)) ret.push_back(i); } return ret; } };