2018-9-6号做的笔试,一题没做出来,自己还是太菜,事后看了大佬的思路,拖了好久才磨出来。整理一下,以备后用。
参考别人的思路:有n个顶点进行深度遍历时,除去最长的那条路径所含的边只走一次之外,其他每条边经过两次。所以只需要找出深度最深的路径就可,设最深的路径长度为L,总路程为2*(n-1)-L。
自己画图的话,如图所示:
则可以算出此图的最短路程为18.
代码如下:
public class Main{
private static int max=0;
private static int temp=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
List <Integer> [] list=new ArrayList [n+1];
for (int i = 0; i < list.length; i++) {
list[i]=new ArrayList<>();
}
for (int i = 1; i < list.length-1; i++) {
int key=sc.nextInt();
int value=sc.nextInt();
list[key].add(value);
}
dfs(1,list);
System.out.println(2*(n-1)-max);
}
public static void dfs(int n,List <Integer> [] list) {
if(list[n].size()==0) {
if(temp>max)
max=temp;
return;
}else {
for (int i = 0; i < list[n].size(); i++) {
temp++;
dfs(list[n].get(i),list);
temp--;
}
}
}
}
最后得到结果:
题中所给测试用例: