哈理工OJ-1326-Leyni的国家

Leyni经过了若干年的征战,终于建立了自己的国家,这个国家包含n个城市,编号为1到n。城市c是首都,每条城市中的路都是双向的,而且从首都到每个城市都只存在一条路线。
在Leyni的国家,他使用一种奇怪的方式来描述地图:对每一个非首都城市记录了一个数字pi,代表着从首都到城市i的路线中在到达城市i之前经过的最后一个城市的编号。
但是现在,Leyni计划将首都由城市c改为城市k,所以需要你按照他的国家的地图描述方式做出新地图,请你帮助他!
Input
本题有多组测试数据,输入的第一行是一个整数T代表着测试数据的数量,接下来是T组测试数据。
对于每组测试数据:
第1行 包含三个以空格分隔的整数n,c,k (2 ≤ n ≤ 50000, 1 ≤ c ≠ k ≤ n)。
第2行 包含以空格分隔的n – 1个整数,代表着原地图的内容。整数分别对应着p1,p2,…,pc – 1,pc + 1,…,pn – 1,pn(注意不含pc)。
Output
对于每组测试数据:
第1行 输出以空格分隔的n – 1个整数,代表着新地图的内容。整数分别对应着p1,p2,…,pk – 1,pk + 1,…,pn – 1,pn(注意不含pk)。
Sample Input
2
3 2 3
2 2
6 2 4
6 1 2 4 2
Sample Output
2 3
6 4 1 4 2

http://blog.csdn.net/mengxiang000000/article/details/51324364?locationNum=3&fps=1

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;

vector<int>Map[50005];
int vis[50005],ans[50005];
int p[50005];
void dfs(int x)
{
    for(int i=0; i<Map[x].size(); i++)
    {
        int u=Map[x][i];
        if(!vis[u])
        {
            vis[u]=1;
            ans[u]=x;
            dfs(u);
        }
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,c,k;
        scanf("%d%d%d",&n,&c,&k);
        for(int i=1; i<=n; i++)
        {
            Map[i].clear();
        }
        memset(ans,0,sizeof(ans));
        memset(vis,0,sizeof(vis));
        for(int i=1; i<=n; i++)
        {
            if(i!=c)
            {
                scanf("%d",&p[i]);
                if(p[i]!=c)
                {
                    Map[p[i]].push_back(i);
                    Map[i].push_back(p[i]);
                }
                else
                {
                    Map[c].push_back(i);
                    Map[i].push_back(c);
                }
            }
        }

        dfs(k);
        int t=0;
        for(int i=1; i<=n; i++)
        {
            if(i!=k)
            {
                if(t==0)
                {

                    printf("%d",ans[i]);
                }
                else
                {
                    printf(" %d",ans[i]);
                }
                t++;
            }
        }
        printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/li_hongcheng/article/details/79478415