CodeForces - 1131F(F - Asya And Kittens)(并查集)(简单题)

emmmm没想到CFdiv2的F题竟然比前面的两道题简单?(狗头)
题意:给定n个坑,每次可以拆掉一个相邻坑之间的隔板,现给出拆隔板的顺序,要求复原未拆隔板之前的坑的样子。
题解:写个并查集维护一个链式的结构,最后链式输出即可。
hint:要注意进行路径压缩,不然会T。
附上ACcode:

#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=2e5;
int f[N],r[N],p[N];
const ll inlld=0x3f3f3f3f3f3f3f3f,mod=998244353;
int getf(int x)
{
    return f[x]==x?x:f[x]=getf(f[x]);
}
int getr(int x)
{
    return r[x]==x?x:r[x]=getr(r[x]);
}
void printans(int x)
{
    cout << x << ' ';
    if(p[x]==x)return ;
    else return printans(p[x]);
}
int main()
{
    ios::sync_with_stdio(false);
    int n,a,b;cin>>n;
    for(int i=1;i<=n;i++){
         f[i]=r[i]=p[i]=i;
    }
    for(int i=1;i<=n-1;i++){
        cin>>a>>b;
        int fa=getf(a),fb=getf(b);
        if(fa<fb){
            int ra=getr(fa);
            r[ra]=fb;
            f[fb]=fa;
            p[ra]=fb;
        }
        else {
            int rb=getr(fb);
            r[rb]=fa;
            f[fa]=fb;
            p[rb]=fa;
        }
    }
    int fi;
    for(int i=1;i<=n;i++){
        if(f[i]==i){
            fi=i;break;
        }
    }
    printans(fi);
    return 0;
}
/*
5
1 4
2 5
3 1
4 5
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值