一开始我认为本题是最短路,采用了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是上一条的集中体现。

京公网安备 11010502036488号