并查集——Codeforces 28B 交换格子

【题目描述】 有一天某个数组的 n 个格子决定玩一个游戏。起初每个格子中存储的数字等于该格子的编号(从 1
开始)。每个格子确定了自己最喜欢的数字 di,每一轮游戏操作过程中,任意一个格子 i 和另一个格子 j 如果满足 | i - j | =
di,则可以交换他们所存储的数字。操作顺序和次数没有限制。 你会知道每个格子最喜欢的数字,以及一个从 1 到 n
的排列。你需要判断游戏是否能够进行到指定排列的状态。 【输入格式】 输入第一行包含一个整数 n(1 <= n <=
100),表示数组中格子的个数。(初始状态是从1-n) 第二行包含 n 个不同的整数,大小从 1 到 n,表示指定排列。(最后到达的状态)
第三行包含 n 个整数,大小从 1 到 n,表示对应格子最喜欢的数字。 【输出格式】 如果游戏能够进行到指定排列,则输出 YES,否则输出
NO。

在这里插入图片描述

本题关键在于转换题意:
一开始在位置i的数是i,最后在位置i的数是j (pos[j]=i)
如果这两个数可以交换,或者借助其他数间接交换,这一点的末状态就可以达到。

abs(I-j) = num
(1) I > j : I - j = num , j = I - num
(2) I < j : j - I = num, j = I + num

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<vector>
#include<string>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 105;
int n;
int pre[maxn];
int pos[maxn];
int fav[maxn];

void init(){
    for(int i=0; i<=n; i++)
        pre[i] = i;
}
int find(int x){
    int r = x;
    while(r!=pre[r])
        r = pre[r];
    while(x!=r){
        int t = pre[x];
        pre[x] = r;
        x = t;
    }
    return r;
}
void join(int a,int b){
    int fa = find(a);
    int fb = find(b);
    if(fa!=fb)
        pre[fa] = fb;
}
void in_put(){
    int t;
    for(int i=1; i<=n; i++){
        cin >> t;
        pos[t] = i; //t最后要在第i的位置——要看能否与i联通起来
    }
    for(int i=1; i<=n; i++)
        cin >> fav[i];
}
void Union(){
    //位置i 喜欢的数是fav[i]
    for(int i=1; i<=n; i++){
        if(i+fav[i]<=n)
            join(i,fav[i]+i);
        if(i-fav[i]>=1)
            join(i,i-fav[i]);
    }
}
void check(){
    bool flag = 1;
    for(int i=1; i<=n; i++){
        //这个位置的格子不能与最后在这个位置的格子联通
        if(find(i) != find(pos[i])){
            flag = 0;
            break;
        }
    }
    if(flag)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
int main(){
    while(cin >> n){
        init();
        in_put();
        Union();
        check();
    }
    return 0;
}

发布了62 篇原创文章 · 获赞 0 · 访问量 1715

猜你喜欢

转载自blog.csdn.net/jhckii/article/details/104581254