首页 > 代码库 > hihoCoder 1041 国庆出游 最详细的解题报告
hihoCoder 1041 国庆出游 最详细的解题报告
题目来源:国庆出游
解题思路(下面是大神的写的):
把题目中的序列称作S,树称作T。那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中的位置都恰好紧跟在x的后面,没有被其他节点隔开。 设x的子孙节点是abcd,那么--xabcd--, --xbcda-- 等等是合法的,--xab-cd--, --axbcd--, --x--abcd--, 都是不合法的(‘-‘指其他节点)。对于S中每个节点都做如上判断,如果有不合法的就输出NO,如果都合法就输出YES。
感谢两位大神gtdzx和aprilzc,解题思路是gtdzx大神提供的,代码参考aprilzc大神的
具体算法(java版,可以直接AC)
1 import java.util.Scanner; 2 3 public class Main { 4 //判断father是否为child的子孙节点 5 public static boolean isAncestor(int[] tree, int father, int child) { 6 while (tree[child] != child) { 7 child = tree[child];//将child的父节点赋值给child 8 if (father == child) 9 return true;10 }11 return false;12 }13 14 public static boolean judge(int[] tree, int[] array, int start, int end) {15 if (start >= end)//所有节点都检查完了16 return true;17 int k = start + 1;//当前节点的下一个节点18 //依次计算当前节点start后面的节点是否为它的子孙节点(这些节点必须是连续的)19 while (k <= end && isAncestor(tree, array[start], array[k])) {20 k++;21 }22 //如果后面所有的节点均是start的子孙节点23 //说明该节点的已经通过检查,然后判断下一个当前节点(start+1)24 if (k >= end) {25 return judge(tree, array, start + 1, end);26 }27 int v = k + 1;28 //判断后面的节点(除连续子孙节点外,k是最后一个连续子孙节点)29 //是否为start的子孙节点,如果是,说明存在一个非连续的子孙节点,30 //直接return false31 while (v <= end) {32 if (!isAncestor(tree, array[start], array[v])) {33 return false;34 }35 v++;36 }37 38 //start已经检查完了,用来判断后面的节点(start+1)39 return judge(tree, array, start+1,end);40 41 //大神的最后一句代码如下:42 //return judge(tree, array, start, k - 1) && judge(tree, array, k, end);43 //个人觉得效果是一样的44 }45 46 public static void main(String[] args) {47 Scanner scanner = new Scanner(System.in);48 int T = scanner.nextInt();49 for (int i = 0; i < T; i++) {50 int n = scanner.nextInt();51 int[] tree = new int[n + 1];52 tree[1] = 1;53 for (int j = 0; j < n - 1; j++) {54 int father = scanner.nextInt();55 int child = scanner.nextInt();56 tree[child] = father;57 }58 int m = scanner.nextInt();59 int[] array = new int[m];60 for (int j = 0; j < m; j++) {61 array[j] = scanner.nextInt();62 }63 if (judge(tree, array, 0, array.length - 1)) {64 System.out.println("YES");65 } else {66 System.out.println("NO");67 }68 }69 scanner.close();70 }71 }
hihoCoder 1041 国庆出游 最详细的解题报告
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。