标题:风险度量

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. }

蓝桥杯_风险度量_dfs_无向图两节点间的所有路径的更多相关文章

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

    标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如 ...

  2. 蓝桥杯之大臣的旅费(两次dfs)

    Description 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个 ...

  3. PREV-9_蓝桥杯_大臣的旅费

    问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...

  4. 蓝桥杯_算法训练_ALGO10_集合运算

    这个题实际上思路是比较简单的,但是需要注意细节问题. 思路:读入数组之后进行排序,然后再求交.并.补集. 首先排序:(使用的是冒泡排序) #include<iostream> using ...

  5. 蓝桥杯_算法训练_区间k大数查询

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  6. ALGO-43_蓝桥杯_算法训练_A+B Problem

    问题描述 输入A,B. 输出A+B. 输入格式 输入包含两个整数A,B,用一个空格分隔. 输出格式 输出一个整数,表示A+B的值. 样例输入 样例输出 数据规模和约定 -,,,<=A,B< ...

  7. ALGO-117_蓝桥杯_算法训练_友好数

    问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:+= 4的约数和有:+= 所以9和4不是友好的. 220的约数和有: = 284的约 ...

  8. ALGO-118_蓝桥杯_算法训练_连续正整数的和

    问题描述 78这个数可以表示为连续正整数的和,++,+++,++. 输入一个正整数 n(<=) 输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+)+...+b=n. 对于多 ...

  9. ALGO-119_蓝桥杯_算法训练_寂寞的数

    问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和.例如,d()=++=, d()=++++=. 因此,给定了任意一个n作为起点,你可 ...

随机推荐

  1. 安装juicer

    由于我第一次安装 JUICER时遇到了很多问题,现在把这些问题都记录下来,给同样第一次安装使用的同学一点借鉴. 前面已经安装了Torch3和Tracter,这都是为安装Juicer做的准备,现在安装J ...

  2. mysql默认字符集问题

    最近在使用mysql的时候出现了奇怪的乱码问题,最开始发现mysql的字符集的确存在一些问题. 经过修改配置文件/etc/my.cnf [mysqld] character-set-server=ut ...

  3. 分页查询关键代码 多条件查询关键代码 删除选中商品关键代码 修改要先回显再修改 修改要先回显再修改 同一业务集中使用同一servlet的方法

    分页查询关键代码: 通过servlet转发回来的各种信息进行分页的设计(转发回的信息有 分页查询的List集合 查询的页码 查询的条数 查询的数据库总条数 查询的总页码) 从开始时循环10次出现十个数 ...

  4. 开发SDK注意事项

    1. 修改类别文件名及类别方法. 开发SDK时通常会用到比较多的第三方的类别方法, 这样的话, 开发者在使用你的SDK时, 因为他可能也会加一些第三方的开源库, 比如都使用了NSString的md5类 ...

  5. iconv for linux(c)

    // code_convert("gb2312","utf-8",inbuf,outbuf,outlen);static int code_convert(co ...

  6. 屏蔽datatable错误提示

    $.fn.dataTable.ext.errMode = 'none'; //不显示任何错误信息// 以下为发生错误时的事件处理,如不处理,可不管.$('#productionRequestItems ...

  7. Lucene简单总结

    Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...

  8. MyCat实现数据库与数据库之间的读写分离

    一.Mycat的安装准备: 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 3.Mycat: Mycat的官方网站: http://www.mycat.o ...

  9. Codeforces Round 97B 点分治

    B. Superset time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  10. Immutable

    Immutable 参考文章 https://zhuanlan.zhihu.com/p/20295971?columnSlug=purerender