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");
}
}