1. import java.util.Scanner;
  2. public class Main {
  3. static int n; // 顶点
  4. static int m; // 通道
  5. static int[][] map;
  6. static boolean[] visited;
  7. static int[] nodes; // 每条可行路径上经过的点
  8. static int[] countArr; // 可行路径上经过的点的次数
  9. static int count; // 可行路径的数量
  10. static int res; // 关键点
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. n = sc.nextInt();
  14. m = sc.nextInt();
  15. visited = new boolean[n+1];
  16. nodes = new int[n+1];
  17. countArr = new int[n+1];
  18. map = new int[n+1][n+1];
  19. // 构建无向图
  20. for(int i = 0; i < m; i++) {
  21. int u = sc.nextInt();
  22. int v = sc.nextInt();
  23. map[u][v] = map[v][u] = 1;
  24. }
  25. int start = sc.nextInt();
  26. int end = sc.nextInt();
  27. dfs(start, end, 0);
  28. if(count == 0) { // 表示没有可行路径
  29. System.out.print(-1);
  30. return;
  31. }
  32. for(int i = 1; i<=n; i++) {
  33. if(countArr[i] == count && i != start && i != end) {
  34. res++;
  35. }
  36. }
  37. System.out.print(res);
  38. }
  39. /**
  40. * @param start 起点
  41. * @param end 终点
  42. * @param index 搜索了第几次
  43. */
  44. private
  45. private static void dfs(int start, int end, int index) {
  46. // TODO Auto-generated method stub
  47. if(start == end) {
  48. count++;
  49. for(int i = 0; i<index; i++) {
  50. // 记录可行路径经过的点的次数
  51. countArr[nodes[i]]++;
  52. }
  53. return;
  54. }
  55. for(int i = 1; i<=n; i++) {
  56. if(map[start][i] == 1 && !visited[i]) {
  57. visited[start] = true;
  58. // 将经过的点存进nodes
  59. nodes[index] = i;
  60. // 下一次深搜以i作为起点,因为无向图的搜索路径是 start->i->.....->end
  61. dfs(i,end,index+1);
  62. visited[start] = false;
  63. }
  64. }
  65. }
  66. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论