@topcoder - 2017TCOAlgorithmRound2A - D1L2 @ DistanceZeroAndOne


@説明@

0からN-1までの番号、簡単な通信を、図n個の点のいずれもありません。

現在、0 dist0 []は、各点dist1 1 []の距離、全体図の減少、または全く溶液が決定された各点の距離を与えられています。

制約
のn-間2-50。
要素にdist0 dist1は、n 0〜1の間です。

実施例
0)
{0,2,1}
、{2,0,1}
戻り値:{
"NNY"、
"NNY"、
"YYN"}
グラフ全体0--2--1。

1)
{0,2,1}
、{1,0,2}
戻り値:{}
dist0 [1]≠dist1 [0]。

@解決@

三角不等式、uとvの間にエッジが存在する場合、| dist0 [U] - dist0 [V] |≤1と| dist1 [U] - dist1 [V] |≤1。

縁部は、U、V(即ち、三角不等式を満足する)、その後も(U、V)との間に接続することができる場合。
明らかに、より一層の点の間の距離より正確なエッジ。
ソリューションのであれば、上記の方式でも、有効な解決策をサイド得ることができるようになります。

双方は、それがdist1リミットdist0でこの数字を満たしているエッジBFSテストを終えた後、私たちも、再び実行します。

@acceptedコード@

#include<queue>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class DistanceZeroAndOne{
    #define MAXN 50
    private:
    int a[MAXN][MAXN], n;
    int abs(int x) {return x >= 0 ? x : -x;}
    int d[MAXN];
    public:
    void bfs(int x) {
        for(int i=0;i<n;i++)
            d[i] = n;
        d[x] = 0; queue<int>que; que.push(x);
        while( !que.empty() ) {
            int f = que.front(); que.pop();
            for(int i=0;i<n;i++)
                if( a[f][i] && d[f] + 1 < d[i] ) {
                    d[i] = d[f] + 1, que.push(i);
                }
        }
    }
    vector<string>ans;
    vector<string>construct(vector<int>d0, vector<int>d1) {
        ans.clear(), n = d0.size();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if( i != j && abs(d0[i] - d0[j]) <= 1 && abs(d1[i] - d1[j]) <= 1 )
                    a[i][j] = 1;
        bool flag = true;
        bfs(0);
        for(int i=0;i<n;i++)
            if( d[i] != d0[i] )
                flag = false;
        if( !flag ) return ans;
        bfs(1);
        for(int i=0;i<n;i++)
            if( d[i] != d1[i] )
                flag = false;
        if( !flag ) return ans;
        for(int i=0;i<n;i++) {
            string s = "";
            for(int j=0;j<n;j++)
                if( a[i][j] ) s = s + 'Y';
                else s = s + 'N';
            ans.push_back(s);
        }
        return ans;
    }
};

@詳細@

以下のように。また、ノー詳細。

おすすめ

転載: www.cnblogs.com/Tiw-Air-OAO/p/11568373.html