原题链接:蓝桥杯2013年第四届真题-危险系数
解题思路: DFS暴力搜索,使用了全局栈和全局数据存储数据
注意事项:
参考代码:
import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
// https://www.dotcpp.com/oj/problem1433.html
// 看似是BFS, 其实需要用dfs搜出所有的路径
public class Main {
static StreamTokenizer cin;
static PrintWriter out;
static int n; // 站点数
static int m; // 通道数
// 危险系数询问站点
static int u;
static int v;
static boolean[] visited;
static ArrayList<Integer>[] map; // 临接表
static Stack<Integer> stack;
static long[] count; // 每个节点的访问次数, 用于寻找关键点
// 关键点必须在找到的每条路径中都出现
public static void main(String[] args) throws IOException{
cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
out = new PrintWriter(new OutputStreamWriter(System.out));
n = nextInt();
m = nextInt();
map = new ArrayList[n+1];
visited = new boolean[n+1]; // 访问数组, 防止成环
count = new long[n+1];
for(int i = 1; i < n+1; i++)
map[i] = new ArrayList<>();
for(int j = 0; j < m; j++){
int f = nextInt();
int t = nextInt();
map[f].add(t);
map[t].add(f);
}
u = nextInt();
v = nextInt();
visited[u] = true;
stack = new Stack<>();
long paths = dfs(u, v);
int s = 0;
if (Arrays.stream(count).sum() == 0)
out.println(-1);
else{
for(int i = 1; i < n+1; i++){
if(i != v && paths==count[i])
s++;
}
out.println(s);
}
out.flush();
}
static long dfs(int u, int v){
if(u == v){
for(int index : stack){
count[index]++;
}
return 1;
}
int sum = 0;
for(int node : map[u]){
if(!visited[node]){ // 该顶点未被访问过
visited[node] = true;
stack.push(node);
sum += dfs(node, v);
stack.pop();
visited[node] = false;
}
}
return sum;
}
static int nextInt() throws IOException{
cin.nextToken();
return (int)cin.nval;
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复