dfs 无向图两节点间的所有路径

标题:风险度量

X星系的的防卫体系包含 n 个空间站。这 n 个空间站间有 m 条通信链路,构成通信网。
两个空间站间可能直接通信,也可能通过其它空间站中转。

对于两个站点x和y (x != y), 如果能找到一个站点z,使得:
当z被破坏后,x和y无法通信,则称z为关于x,y的关键站点。

显然,对于给定的两个站点,关于它们的关键点的个数越多,通信风险越大。

你的任务是:已知网络结构,求两站点之间的通信风险度,即:它们之间的关键点的个数。

输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,链路数。
空间站的编号从1到n。通信链路用其两端的站点编号表示。
接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条链路。
最后1行,两个数u,v,代表被询问通信风险度的两个站点。

输出:一个整数,如果询问的两点不连通则输出-1.

例如:
用户输入:
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
则程序应该输出:
2

仔细看这道题,其实就是求两个节点间的所有路径,然后判断哪个节点是必不可少的。

示例中的路径有两条

1->3->4->5->6

1->3->5->6

看出3和5节点都是必不可少的,去掉3或者5后1->6无法联通。

那么用dfs求出所有路径,然后判断有多少节点出现次数跟起始节点一样多就可以了。

dfs思路大概是从起点开始搜索邻接矩阵中能访问的节点,若到达终点或者没有下一个节点可以访问就返回

 1 import java.util.ArrayList;
 2 import java.util.Scanner;
 3 import java.util.Stack;
 4
 5 public class t3 {
 6
 7     static int[][] graph;
 8     static int[] visit;
 9     static Stack<Integer> res = new Stack<Integer>();
10     static ArrayList<Integer[]> temp = new ArrayList<Integer[]>();
11
12     public static void main(String[] args) {
13         // TODO Auto-generated method stub
14         Scanner scanner = new Scanner(System.in);
15         int n = scanner.nextInt();
16         int m = scanner.nextInt();
17         visit = new int[n];
18         graph = new int[n][n];
19         for (int i = 0; i < m; i++) {
20             int t1 = scanner.nextInt();
21             int t2 = scanner.nextInt();
22             graph[t1 - 1][t2 - 1] = 1;
23             graph[t2 - 1][t1 - 1] = 1;
24         }
25         int q1 = scanner.nextInt();
26         int q2 = scanner.nextInt();
27         dfs(q1 - 1, q2 - 1);
28         int[] z = new int[n + 1];
29         for (int i = 0; i < temp.size(); i++) {
30             Integer[] t = temp.get(i);
31             for (int j = 0; j < t.length; j++) {
32                 z[t[j]]++;  //统计出现次数
33             }
34         }
35         int fin = 0;
36         for (int i = 0; i < z.length; i++) {
37             if (z[i] == z[q1] && i != q1 && i != q2) {
38                 fin++;
39             }
40         }
41         System.out.println(fin);
42     }
43
44     public static void dfs(int n, int m) {
45         res.push(n); // 当前节点入栈
46         visit[n] = 1; // 设置访问位为1
47         while (true) {
48             if (n == m) { // 如果已经访问完毕,则输出
49                 Integer[] t = new Integer[res.size()];
50                 for (int i = 0; i < res.size(); i++) {
51                     t[i] = res.get(i) + 1;
52                 }
53                 temp.add(t);
54                 res.pop(); // 弹出顶层
55                 visit[n] = 0; // 设置未访问
56                 break;
57             }
58             for (int i = 0; i < graph.length; i++) {
59                 if (graph[n][i] == 1) {
60                     if (visit[i] == 0) {
61                         dfs(i, m);
62                     }
63                 }
64             }
65             res.pop(); // 到这里说明到了边界,弹出当前位置
66             visit[n] = 0; // 访问位重置
67             break;
68         }
69     }
70
71 }
时间: 2024-10-03 14:24:20

dfs 无向图两节点间的所有路径的相关文章

图算法 - 只需“五步” ,获取两节点间的所有路径(非递归方式)

在实现 “图” 数据结构时,会遇到 “获取两点之间是所有路径” 这个算法问题,网上的资料大多都是利用递归算法来实现(见文末的参考文章). 我们知道在 JS 中用递归算法很容易会让调用栈溢出,为了能在生产环境中使用,必须要用非递归方式的去实现. 经过一番探索,实现的思路主要来自文章 <求两点间所有路径的遍历算法> ,只是该文中并没有给出具体的实现细节,需要自己去实现:最终本文的实现结合类似<算法 - 调度场算法(Shunting Yard Algorithm)> 中所提及的双栈来完成

543. Diameter of Binary Tree(两节点的最长路径)

Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root. Example:Given a binary t

求二叉树中相差最大的两个节点间的差值绝对值

题目描述: 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率. solution: int findMinMax(BTNode *T) { if(!T) return 0; int max = INT_MIN; int min = INT_MAX; stack<BTNode*> s; s.push(T); while (!s.empty()) { BTNode *tmp = s.top(); if(tmp->d

杭电 1869 六度分离 (求每两个节点间的距离)

Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(six degrees of separation).虽然米尔格兰姆的理论屡屡应验,一直也有很多社会学家对其兴趣浓厚,但是在30多年的时间里,它从来就没有得到过严谨的证明,只是一种带有传奇色彩的假说而已. Lele

NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)

Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米.当然,为了节省资金,只要求实现任意2个小岛之间有路通即可.其中桥的价格为 100元/米. Input 输入包括多组数

阿里 2014-08-29 校招机试题 求一个存放整数的二叉树相差最大的两节点差值绝对值

题目:写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这颗二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率. 如果是数值之差,感觉怎么着也得遍历一遍,直接修改下二叉树的基本遍历代码就可以. #include<stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node * left; struct Node * right; } BitNode, *BiTree; /* 求

GoldenGate之update操作节点间不同步——处理办法

GoldenGate之update操作节点间不同步 故障现象:节点1.节点2进行update操作后,不能实现同步 解决过程: 1.常规巡检: 检查进程状态:正常 GGSCI (gc1) 7> info all Program     Status      Group       Lag           Time Since Chkpt MANAGER     RUNNING EXTRACT     RUNNING     EORA_1      00:00:00      00:00:04

脚本化自动构建openstack计算节点间免密码ssh登录

openstack 实例的调整大小和移植功能,都要求计算节点间免密码ssh登录,对于已有的计算节点和新增的计算节点,如何简单快速的使它们之间能够互相两两免密码登录,博主给出了一套实用的脚本. 可先参考脚本化自动部署openstack一文,搭建好环境. 文件清单为: nopasswd-login-controller-to-compute.sh  控制节点可以免密码登录所有的计算节点 nopasswd-login-compute-to-compute.sh    计算节点可以免密码登录其他计算节点

编程之美——二叉树中节点间最大距离

关于递归程序: 递归程序结构包括三部分:递归出口.逻辑处理(需要处理的问题).递归调用(衔接). 通过递归调用将问题转化为对子问题的解决,通过回溯完成原问题的解答: 递归与数学归纳法:递归是数学归纳法在计算机程序中的体现.使用递归思想设计程序时,我们设置base case,并假设我们会获得n-1的结果,并实现n的结果.这就好像数学归纳法,我们只关注初始和衔接,而不需要关注具体的每一步. 当问题采用递归算法求解时,代码如下: 1 #include<iostream> 2 #include<