并查集之游戏

题目

并查集之游戏

思路

并查集,备份原数组,去掉所有应该去掉的边,记录操作
然后从q操作到1操作倒向加边,求解

代码



#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
int df[maxn],f[maxn];
int a[maxn][2];
int n;
int find_root(int x,int num){
    if(num>n)return f[x]=0;
    if(x==f[x])return x;
    return f[x]=find_root(f[x],num+1);

}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        f[i]=i;
    }
    for(int i=1;i<=n;i++){
        int x;scanf("%d",&x);
        if(x!=0)df[i]=f[i]=x;
    }
    int q;scanf("%d",&q);
    for(int i=1;i<=q;i++){
        scanf("%d%d",&a[i][0],&a[i][1]);
        if(a[i][0]==2){
            f[a[i][1]]=a[i][1];
        }
    }
    for(int i=q;i>=1;i--){
        if(a[i][0]==1){
            a[i][1]=find_root(a[i][1],0);
        }
        else{
            f[a[i][1]]=df[a[i][1]];
        }
    }
    for(int i=1;i<=q;i++){
        if(a[i][0]==1){
            if(a[i][1])printf("%dn",a[i][1]);
            else printf("CIKLUSn");
        }
    }
}


原文链接: https://www.cnblogs.com/soda-ma/p/13324967.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    并查集之游戏

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/367020

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午5:25
下一篇 2023年3月2日 下午5:26

相关推荐