AOJ-AHU-OJ-585 公路地图

公路地图
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
Original Transformed
2
3 2 3
2 -1 2
6 2 4
6 -1 1 2 4 2

Sample Output
Original Transformed
2 3 -1
6 4 1 -1 4 2

Source
安徽大学第五届ACM/ICPC程序设计竞赛 网络赛
————————————————————清明节分割线————————————————————
思路:本题不难,只需用一个数组保存每个城市的父亲:距离首都的最后一个中间城市。下标代表每个城市。在更改首都时,只有这两个首都之间的中间城市的父亲会发生改变,其他城市不受影响。这相当于改变父亲(好恐怖)。模拟一下即可。
代码如下:
#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值