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思路大概是从起点开始搜索邻接矩阵中能访问的节点,若到达终点或者没有下一个节点可以访问就返回
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack; public class t3 { static int[][] graph;
static int[] visit;
static Stack<Integer> res = new Stack<Integer>();
static ArrayList<Integer[]> temp = new ArrayList<Integer[]>(); public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
visit = new int[n];
graph = new int[n][n];
for (int i = 0; i < m; i++) {
int t1 = scanner.nextInt();
int t2 = scanner.nextInt();
graph[t1 - 1][t2 - 1] = 1;
graph[t2 - 1][t1 - 1] = 1;
}
int q1 = scanner.nextInt();
int q2 = scanner.nextInt();
dfs(q1 - 1, q2 - 1);
int[] z = new int[n + 1];
for (int i = 0; i < temp.size(); i++) {
Integer[] t = temp.get(i);
for (int j = 0; j < t.length; j++) {
z[t[j]]++; //统计出现次数
}
}
int fin = 0;
for (int i = 0; i < z.length; i++) {
if (z[i] == z[q1] && i != q1 && i != q2) {
fin++;
}
}
System.out.println(fin);
} public static void dfs(int n, int m) {
res.push(n); // 当前节点入栈
visit[n] = 1; // 设置访问位为1
while (true) {
if (n == m) { // 如果已经访问完毕,则输出
Integer[] t = new Integer[res.size()];
for (int i = 0; i < res.size(); i++) {
t[i] = res.get(i) + 1;
}
temp.add(t);
res.pop(); // 弹出顶层
visit[n] = 0; // 设置未访问
break;
}
for (int i = 0; i < graph.length; i++) {
if (graph[n][i] == 1) {
if (visit[i] == 0) {
dfs(i, m);
}
}
}
res.pop(); // 到这里说明到了边界,弹出当前位置
visit[n] = 0; // 访问位重置
break;
}
} }
dfs 无向图两节点间的所有路径的更多相关文章
- 蓝桥杯_风险度量_dfs_无向图两节点间的所有路径
标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如 ...
- [Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径
Given a directed graph, design an algorithm to find out whether there is a route between nodes. 这道题让 ...
- Neo4J 查找两节点之间的路径
# 两节点之间的所有路径MATCH p=(a)-[*]->(b)RETURN p # a->b 直接连接MATCH p=(a)-[]->(b)RETURN p # a-...> ...
- Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)
Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths) 这篇是DFS专题的第一篇,所以我会 ...
- Java 计算两点间的全部路径(一)
算法要求: 在一个无向连通图中求出两个给定点之间的所有路径: 在所得路径上不能含有环路或重复的点: 算法思想描述: 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不 ...
- 二叉树中两节点的最近公共父节点(360的c++一面问题)
面试官的问题:写一个函数 TreeNode* Find(TreeNode* root, TreeNode* p, TreeNode* q) ,返回二叉树中p和q的最近公共父节点. 本人反应:当时有点 ...
- 集群节点间网络通信TIPC
1. TIPC背景介绍 TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括: 协议发送的大部分message都是直接到达目的地(无路由): message的传输时间都很短; messag ...
- 分享:根据svg节点对象类型和路径值转换坐标值
功能用处: 对svg文件的路径节点填充时会使用(相邻两个坐标区域内的四边形的填充颜色不重复). 需要对svg文件中的Path节点或者 Polyline 节点做颜色填充.并且相邻的两个区域之间的颜色不允 ...
- 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50
前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...
随机推荐
- Scrollview回弹效果自定义控件
滚动回弹效果分析: 首先,创建一个类,继承scrollview,重写ontouch事件,实现伸缩回弹效果. [scroollview节点下只能有一个子节点,这个子节点就是我们要移动的view布局] ...
- 内功心法 -- java.util.ArrayList<E> (4)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 解析.NET对象的跨应用程序域访问--AppDomain(上篇)
在目前的项目开发中,分布式开发已经逐渐成为主流.一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目.这句话虽然有些过激,但是随着人们对效率的要求在提高,以及产品需要提升用户体验.只有 ...
- MongoDB与Redis的比较
MongoDB和Redis都是NoSQL,采用结构型数据存储.二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同. MongoDB建议集群部署,更多的考虑到集 ...
- 转自scutan 常用的Linux编程库
库 头文件 描述libGL.so ...
- Android搜索框以及内容提供器
先看结果: 相关的官方文档在这里:Creating a Search Interface Android官方提供了两种方式: 弹出一个Dialog,覆盖当前的Activity界面 在AppBar中扩展 ...
- TFS实现需求工作项自动级联保存
目前在一个大型的金融客户软件研发平台项目实施和支持过程中,客户的质量管理团队基于该平台以及结合其它的平台数据,针对需求管理和业务过程需要拟定了一套完整的需求提出.评审.设计以及实现的流程.基于这套流程 ...
- android开发过程中踩过的坑
1) 4.X下 viewgroup 不一定会向下传递requestLayout,当onlayout的速度比较慢(比如子View比较复杂之类的原因),系统会跳帧!此时子View下层的view可能就不会再 ...
- java判断字符串String中是否存在中文
public class IsContainChinese { public static boolean isContainChinese (String str){ boolean flag=tr ...
- 创建Win32图形界面应用程序
没有什么比创建一个Win32图形界面应用程序能让Win32汇编初学者更兴奋的了! 然而,对于像我这样没有代码便会陷入困境的人来说,看到下面的代码总能让人为之一振,百余行的代码使得Win32GUI编程并 ...