蓝桥杯JAVA版答案——历年真题——危险系数

更多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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值