zoukankan      html  css  js  c++  java
  • Codeforces 28B. pSort 连通性

    B. pSort
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    One day n cells of some array decided to play the following game. Initially each cell contains a number which is equal to it's ordinal number (starting from 1). Also each cell determined it's favourite number. On it's move i-th cell can exchange it's value with the value of some other j-th cell, if |i - j| = di, where di is a favourite number of i-th cell. Cells make moves in any order, the number of moves is unlimited.

    The favourite number of each cell will be given to you. You will also be given a permutation of numbers from 1 to n. You are to determine whether the game could move to this state.

    Input

    The first line contains positive integer n (1 ≤ n ≤ 100) — the number of cells in the array. The second line contains n distinct integers from 1 to n — permutation. The last line contains n integers from 1 to n — favourite numbers of the cells.

    Output

    If the given state is reachable in the described game, output YES, otherwise NO.

    Sample test(s)
    input
    5
    5 4 3 2 1
    1 1 1 1 1
    
    output
    YES
    
    input
    7
    4 3 5 1 2 7 6
    4 6 6 1 6 6 1
    
    output
    NO
    
    input
    7
    4 2 5 1 3 7 6
    4 6 6 1 6 6 1
    
    output
    YES

    在每个cell与它能交换的cell间连一条边,最后若每个cell与permutation都连通则答案为YES,否则为NO。


    #include <iostream>
    #include <string>
    #include <algorithm>
    
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    
    #include <map>
    #include <set>
    #include <vector>
    #include <queue>
    #include <stack>
    
    using namespace std;
    
    #define max_int       INT_MAX / 2
    #define max_long      0xFFFFFFFFFFFFFFFLL / 2
    #define two(a)        (1 << (a))
    #define eps           1e-6
    #define FF(i, a, b)   for (int i = (a); i <= (b); i++)
    #define FFD(i, a, b)  for (int i = (a); i >= (b); i--)
    
    const int OO=1e9;
    const int INF=1e9;
    
    int n;
    
    vector<int>a[111];
    int p[111];
    int f[111];
    bool g[111][111];
    bool ok;
    
    bool dfs(int bg,int u,int ed)
    {
        g[bg][u]=true;
        if (u==ed) return true;
        int len=a[u].size();
        int v;
        FF(i, 0, len-1)
        {
            v=a[u][i];
            if (!g[bg][v])
            {
                if (dfs(bg,v,ed)) return true;
            }
        }
        return false;
    }
    
    int main()
    {
        memset(g,0,sizeof(g));
        cin>>n;
        FF(i, 1, n)
        {
            cin>>p[i];
        }
        FF(i, 1, n)
        {
            cin>>f[i];
            if (i+f[i]<=n)
            {
                a[i].push_back(i+f[i]);
                a[i+f[i]].push_back(i);
            }
    
            if (i-f[i]>=1)
            {
                a[i].push_back(i-f[i]);
                a[i-f[i]].push_back(i);
            }
        }
        ok=true;
        FF(i ,1, n)
        {
            if (!dfs(i,i,p[i]))
            {
                ok=false;
                break;
            }
        }
        if (ok) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        return 0;
    }
    



  • 相关阅读:
    Algs4-1.1.27二项分布
    Algs4-1.1.25数学归纳法证明欧几里得算法
    Algs4-1.1.26证明以下代码能够将a、b、c按照升序排列
    Algs4-1.1.24欧几里得算法求最大公约数
    Algs4-1.1.23区分在与不在白名单中的值
    Algs4-1.1.22以缩进方式打印递归参数
    微服务架构是什么?
    python 迭代器
    python 列表推导
    python 创建二维数组的方法
  • 原文地址:https://www.cnblogs.com/cyendra/p/3038466.html
Copyright © 2011-2022 走看看