一开始我认为本题是最短路,采用了BFS实现,只能过47%的案例。
本题的最简思路是并查集。
class Solution { public: int fa[100010], a[100010]; vector<int> vt[100010]; int find(int rt) { return fa[rt] == rt ? rt : fa[rt] = find(fa[rt]); } void Union(int x, int y) { fa[find(x)] = find(y); } vector<int> solve(int n, int m, vector<int>& perm, vector<Point>& Pair) { for (int i = 1; i <= n; i++) a[i] = perm[i - 1], fa[i] = i; for (auto i : Pair) Union(i.x, i.y); for (int i = 1; i <= n; i++) vt[find(i)].push_back(i); for (int i = 1; i <= n; i++) { vector<int> temp; for (auto j : vt[i]) temp.push_back(a[j]); sort(temp.begin(), temp.end()); for (int j = 0; j < vt[i].size(); j++) a[vt[i][j]] = temp[j]; } vector<int> ans; for (int i = 1; i <= n; i++) ans.push_back(a[i]); return ans; } };
代码如上,很短。
要点在于:
- 朋友的朋友是朋友,链状体系里能互换
- 采用根管理各个体系,sort是上一条的集中体现。