【学习笔记】吝啬的国度 JAVA

吝啬的国度

时间限制: 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)
样例输入
1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7
样例输出
-1 1 10 10 9 8 3 1 1 8


import java.util.ArrayList;
import java.util.Scanner;


public class test {
	static ArrayList<city> citys;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int M = sc.nextInt();
		while(M-->0){
			int N = sc.nextInt();
			int S = sc.nextInt()-1;
			citys = new ArrayList<city>();
			for(int i = 0;i < N;i++){
				citys.add(new city(i));
			}
			for(int i = 0;i < N-1;i++){
				int a = sc.nextInt();
				int b = sc.nextInt();
				citys.get(a-1).nextCitys.add(b-1);
				citys.get(b-1).nextCitys.add(a-1);
			}
			for(int i = 0;i < N;i++){
				search Search = new search(S,i);
				Search.searchs();
			}
		}
	}
	static class city{
		public ArrayList<Integer> nextCitys;
		int id;
		city(int id){
			this.id = id;
			this.nextCitys = new ArrayList<Integer>();
		}
	}
	static class search{
		int startCityId;
		int endCityId;
		ArrayList<Integer> searchsCitys = new ArrayList<Integer>();
		boolean flag = true;
		String ends;
		search(int startCityId,int endCityId){
			this.startCityId = startCityId;
			this.endCityId = endCityId;
		}
		void searchs(){
			if(startCityId != endCityId){
				searchNext(startCityId,endCityId);
				System.out.print(ends+" ");
			}else{
				System.out.print("-1 ");
			}
		}
		void searchNext(int nowCityId,int endCityId){
			for(int i = 0;i < searchsCitys.size();i++){
				if(nowCityId == searchsCitys.get(i)){
					return;
				}
			}
			searchsCitys.add(nowCityId);
			if(flag){
				city nowCity = citys.get(nowCityId);
				for(int i = 0;i < nowCity.nextCitys.size();i++){
					city nextCity = citys.get(nowCity.nextCitys.get(i));
					if(nextCity.id == endCityId){
						flag = false;
						ends = nowCity.id+1+"";
						break;
					}else{
						searchNext(nextCity.id,endCityId);
					}
				}
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值