题目 1452: 网络寻路

题目描述:

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

源地址和目标地址可以相同,但中间节点必须不同。

如下图所示的网络。

1 -> 2 -> 3 -> 1 是允许的

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

代码:

java 复制代码
package lanqiao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;


public class Main {
    static boolean vis[] = new boolean[10010]; //记录走过的节点
    static ArrayList<ArrayList<Integer>> map = new ArrayList<ArrayList<Integer>>(); //邻接表
    static int ans = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for(int i = 0;i <= n;i ++) //初始化节点,将下标为0的节点置为-1
        {
            map.add(new ArrayList<Integer>());
            map.get(i).add(-1);
        }

        for(int i = 1;i <= m;i ++)
        {
            int u = sc.nextInt();
            int v = sc.nextInt();
            map.get(u).add(v);
            map.get(v).add(u);
        }
        Arrays.fill(vis,false); //初始化vis数组
        for(int i = 1;i <= n;i ++)
        {
            vis[i] = true;
            dfs(i,1,i);
            vis[i] = false;
        }
        System.out.println(ans);
    }

    static void dfs(int cur,int step,int root) { //cur:当前节点,step:节点数,root:第一个节点
        if (step == 3) {  //当节点数正好为3时
            for (int i = 1; i < map.get(cur).size(); i++) {
                if (!vis[map.get(cur).get(i)] || map.get(cur).get(i) == root) {  //判断第四个节点是否为第一个节点或者是没有走过的节点
                    ans++;
                }
            }
        } else {
            for (int i = 1; i < map.get(cur).size(); i++) {
                if (!vis[map.get(cur).get(i)]) {
                    vis[map.get(cur).get(i)] = true;
                    dfs(map.get(cur).get(i), step + 1, root);
                    vis[map.get(cur).get(i)] = false;
                }
            }
        }
    }
}
相关推荐
我是哈哈hh1 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy1 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java2 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli2 小时前
滑动窗口->dd爱框框
算法
丶Darling.2 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5202 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19912 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂2 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知3 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)3 小时前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法