更多JAVA版答案移步我的博客:蓝桥杯JAVA版答案汇总
本题考查
图,深搜
思路
若一个结点在所有可能的路径中出现的次数等于所有可能的路径数,则这个点就一定是关键点。
例如:
三条可能的路径(不包括起点与终点)
1 5 4
1 2 4
1 3
则容易看出,1出现的次数为3,2出现的次数为1,3出现的次数为1,4出现的次数为2,5出现的次数为1。关键点只有1,因为其余结点在可能路径中出现的总次数都不等于3
根据以上思路,运用深搜找到所有可能的路径,然后设置一变量total记录路径数量,设置一个整型数组record记录所有可能路径中各个结点的出现的次数,dfs函数形参path记录走过的结点索引,若当前结点是终点,则total加一,将path中所有的结点对应的record数组值加一。最后遍历record数组,若数组值等于可能路径数,则该点是关键点
AC代码
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static LinkedList<LinkedList<Integer>> list = new LinkedList<LinkedList<Integer>>();
static int[] record;
static boolean[] flag;
static int start,end,total=0;
static void dfs(int index, String path) {
if(index == end) {
total++;
String[] tempArr = path.split(" ");
for(int j=0;j<tempArr.length;j++) record[Integer.parseInt(tempArr[j])]++;
}
if(index != start) path+=index+" ";
LinkedList<Integer> tempList = list.get(index);
flag[index] = true;
for(int i:tempList)
if(!flag[i]) dfs(i, path);
flag[index] = false;
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int nodeNum = scaner.nextInt(),edgeNum = scaner.nextInt(),result=0;
flag = new boolean[nodeNum];
record = new int[nodeNum];
for (int i = 0; i < nodeNum; i++) list.add(new LinkedList<Integer>());
for (int i = 0; i < edgeNum; i++) {
int temp1 = scaner.nextInt()-1,temp2 = scaner.nextInt()-1;
list.get(temp1).add(temp2);
list.get(temp2).add(temp1);
}
start = scaner.nextInt()-1;
end = scaner.nextInt()-1;
scaner.close();
dfs(start, "");
for(int i=0;i<nodeNum;i++)
if(record[i]==total) result++;
System.out.println(result);
}
}