当前位置:   article > 正文

题目 1452: 网络寻路

题目 1452: 网络寻路

题目描述:

X  国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。
如下图所示的网络。

1  ->   2  ->   3  ->   1  是允许的
1  ->   2  ->   1  ->   2  或者  1  ->   2  ->   3  ->   2  都是非法的。

代码:

  1. package lanqiao;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.Scanner;
  6. public class Main {
  7. static boolean vis[] = new boolean[10010]; //记录走过的节点
  8. static ArrayList<ArrayList<Integer>> map = new ArrayList<ArrayList<Integer>>(); //邻接表
  9. static int ans = 0;
  10. public static void main(String[] args) {
  11. Scanner sc = new Scanner(System.in);
  12. int n = sc.nextInt();
  13. int m = sc.nextInt();
  14. for(int i = 0;i <= n;i ++) //初始化节点,将下标为0的节点置为-1
  15. {
  16. map.add(new ArrayList<Integer>());
  17. map.get(i).add(-1);
  18. }
  19. for(int i = 1;i <= m;i ++)
  20. {
  21. int u = sc.nextInt();
  22. int v = sc.nextInt();
  23. map.get(u).add(v);
  24. map.get(v).add(u);
  25. }
  26. Arrays.fill(vis,false); //初始化vis数组
  27. for(int i = 1;i <= n;i ++)
  28. {
  29. vis[i] = true;
  30. dfs(i,1,i);
  31. vis[i] = false;
  32. }
  33. System.out.println(ans);
  34. }
  35. static void dfs(int cur,int step,int root) { //cur:当前节点,step:节点数,root:第一个节点
  36. if (step == 3) { //当节点数正好为3时
  37. for (int i = 1; i < map.get(cur).size(); i++) {
  38. if (!vis[map.get(cur).get(i)] || map.get(cur).get(i) == root) { //判断第四个节点是否为第一个节点或者是没有走过的节点
  39. ans++;
  40. }
  41. }
  42. } else {
  43. for (int i = 1; i < map.get(cur).size(); i++) {
  44. if (!vis[map.get(cur).get(i)]) {
  45. vis[map.get(cur).get(i)] = true;
  46. dfs(map.get(cur).get(i), step + 1, root);
  47. vis[map.get(cur).get(i)] = false;
  48. }
  49. }
  50. }
  51. }
  52. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/541541
推荐阅读
相关标签
  

闽ICP备14008679号