您的位置:首页 > 其它

AOJ-AHU-OJ-585 公路地图

2014-04-05 11:00 351 查看
公路地图

Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB

Description

long long ago,cxlove是某国国王,掌控着n个城市,而且为了交通便捷,在城市与城市之间建立了公路,并且保证任意两个城市之间有且仅有一条路。简而言之,整个交通网是一个树型结构(PS:cxlove在很多年前就用了最小的代价,构造生成树,形成连通网络了)

这n个城市都编了号,标号分别为1,2……,n

在cxlove年轻的时候,一直定居在r1打拼,那就是所谓的首都吧~~~~

直到年迈的时候,cxlove本着由城市向农村发展的原则,准备迁都至r2。

首都作为一个国家的枢纽,地位非同一般。

当首都确定时,cxlove便会命令下属以首都为中心调查清楚整个国家交通网的情况。并采用了以下交通网表示法:对于每一个城市i,ai表示从首都到城市i的路径上的最后一个城市(除了i)。

cxlove已经拥有了r1为首都时的交通资料,如今首都城市更改,cxlove想要节省人力物力而不去重新统计交通网,希望你能给出以r2为首都的交通资料。

例如:1->2->3,如果城市1为首都,那么从1->2的路径中,最后一个城市是1,从1->3的路径中,最后一个城市是2

Input

一个整数 T,表示有 T 组测试数据。(1<=T<=30)

每组数据输入格式如下:

三个整数n,r1,r2,分别表示n个城市,原先的首都,新的首都。(1<=n<=10000,1<=r1!=r2<=n)

接下来n个整数a1,a2……,an,表示首都为r1时的的交通网,其中对于r1自己而言,记录为-1。

Output

每组输出一行整数,按标号顺序表示首都为r2时的交通网

Sample Input
OriginalTransformed
2
3 2 3
2 -1 2
6 2 4
6 -1 1 2 4 2


Sample Output
OriginalTransformed
2 3 -1
6 4 1 -1 4 2


Source

安徽大学第五届ACM/ICPC程序设计竞赛 网络赛

[align=center]————————————————————清明节分割线————————————————————[/align]
[align=center]思路:本题不难,只需用一个数组保存每个城市的父亲:距离首都的最后一个中间城市。下标代表每个城市。在更改首都时,只有这两个首都之间的中间城市的父亲会发生改变,其他城市不受影响。这相当于改变父亲(好恐怖)。模拟一下即可。[/align]
[align=center]代码如下:[/align]
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int fath[10005];
int main() {
int cas, city, r1, r2;
scanf("%d", &cas);
while(cas--) {
scanf("%d%d%d", &city, &r1, &r2);
for(int i = 1; i <= city; i++)
scanf("%d", fath+i);
int v = r2, c = -1, u;
for(;;) {
if(fath[v] != -1) {//从新首都开始
u = fath[v];//暂存旧的父亲
fath[v] = c;//改为新的父亲
c = v;//该城市成为新的父亲
v = u;//旧的父亲成为下一个城市
}
else {
fath[v] = c;//走到了旧的首都,完成更改,结束模拟
break;
}
}
for(int i = 1; i < city; i++)
printf("%d ", fath[i]);
printf("%d\n", fath[city]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: