题目:在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。
思路:根据题目来的例子画出的是树,但是为了保险起见还是用图的方式来存储。然后是求S点与T点之间的路径,采用深度优先搜索。其中的问题就是一开始全用linkedlist来创建,提交上去(南阳oj)就发现报出编译错误,然后换成List Arraylist又能通过了,这里不是很明白。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Country {
static List<Integer>[] list;//用来存储图的顶点
static boolean[] vist;//用来标志顶点是否被访问过
static int[] arr;//用来存储上一个城市的编号
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=in.nextInt();
while (m>0) {
int n=in.nextInt();
int s=in.nextInt()-1;
arr=new int[n];
arr[s]=-1;
vist=new boolean[n];
//利用邻接表创建图
list=new ArrayList[n];
for (int i = 0; i < list.length; i++) {
list[i]=new ArrayList<>();
}
for (int i = 0; i < n-1; i++) {
int a=in.nextInt()-1;
int b=in.nextInt()-1;
list[a].add(b);
list[b].add(a);
}
//深度优先搜索
DFS(s);
//输出
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
m--;
}
// TODO Auto-generated method stub
}
//深度优先搜索
public static void DFS(int s){
vist[s]=true;
for (Integer i:list[s]) {
if (vist[i]) {
continue;
}
arr[i]=s+1;
DFS(i);
}
}
}