ACM_20吝啬的国度

来源:互联网 发布:淘宝网都市丽人内衣 编辑:程序博客网 时间:2024/05/16 01:37

吝啬的国度

时间限制:1000 ms  内存限制:65535 KB
难度:3
描述
在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。
输入
第一行输入一个整数M表示测试数据共有M(1<=M<=5)组
每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表示城市的总个数,S表示参观者所在城市的编号
随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。
输出
每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号。(其中i=S时,请输出-1)
样例输入
110 11 91 88 1010 38 61 210 49 53 7
样例输出
-1 1 10 10 9 8 3 1 1 8
来源
经典题目
上传者
张云聪


分析
主要考验的是无根树转化成有根树的算法

失败经验: 1 采用 矩阵做, 空间开销过大
               放弃矩阵 直接搜索,  直接搜索的时间开销太大

解决方案:  采用双向树 每条边存2边,每一个顶点知道能链接的顶点,用frontCity参数作为为转换成有根树的父节点的标记


package practise;

importjava.util.ArrayList;
importjava.util.Scanner;

publicclass FindPath_V3 {
publicstatic void main(String[] args) {
       FindPath_V3 findPath = newFindPath_V3();
       findPath.solution();
}
publicvoid solution(){
  Scanner in = newScanner(System.in);
  int groups = in.nextInt();
  
  for(int i = 0 ; i < groups ;i++){
 int size = in.nextInt();
 City[] citylist =newCity[size+1];
 
 for(int j = 1 ; j <= size ;j++){
 citylist[j] = new City(j);
 }
 
 int startCity =in.nextInt();
 
 for(int j = 1 ; j < size ;j++){
 int tempx = in.nextInt();
 int tempy = in.nextInt();
 
 citylist[tempx].linkedCity.add(tempy);
 citylist[tempy].linkedCity.add(tempx);
 
 }
 
 ArrayList waitingCity = newArrayList();
 
 citylist[startCity].frontCity =-1;
 
 for(int j = 0 ; j <citylist[startCity].linkedCity.size();j++){
 int temp =citylist[startCity].linkedCity.get(j);
 citylist[temp].frontCity =startCity;
 }
 
 waitingCity.addAll(citylist[startCity].linkedCity);
 
 while(waitingCity.size() >0){
 int temp  =waitingCity.remove(0);
 for(int j = 0 ; j <citylist[temp].linkedCity.size();j++){
 int tempCity  =citylist[temp].linkedCity.get(j);
 if(citylist[tempCity].frontCity ==0){
 citylist[tempCity].frontCity =temp;
 waitingCity.add(tempCity);
     }
    }
 
   
 for(int j = 1 ; j <=size ; j++){
 System.out.print(citylist[j].frontCity+"");
 }
 System.out.println();
  }
}
classCity{
intid;
ArrayList linkedCity;
intfrontCity;
       
publicCity(int id){
this.id = id;
linkedCity =  newArrayList();
frontCity = 0;
}
}
}

0 0
原创粉丝点击