旋转跳跃 - 并查集

旋转跳跃

https://ac.nowcoder.com/acm/contest/6383/C

一开始我认为本题是最短路,采用了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;
    }
};

代码如上,很短。

要点在于:

  1. 朋友的朋友是朋友,链状体系里能互换
  2. 采用根管理各个体系,sort是上一条的集中体现。
算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

07-09 18:33
门头沟学院 Java
这么逆天每年都有人去???&nbsp;填多益网申就是大型的服从性测试
鲁大牛:辅导员在群里发了这个公司我就申了一下。网申居然要写当场开摄像头写两篇不少于三百字的作文。太逆天了
点赞 评论 收藏
分享
码农索隆:力扣的题目还挺贴近现实
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务