目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述

抗日战争时期,冀中平原的地道战曾发挥重要作用。

地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。

我们来定义一个危险系数DF(x,y):

对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。

本题的任务是:已知网络结构,求两站点之间的危险系数。

输入格式

输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数;

接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;

最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。

输出格式
一个整数,如果询问的两点不连通则输出-1.
样例输入
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
样例输出
2

2 解决方案

具体代码如下:

  1. import java.util.ArrayList;
  2. import java.util.Scanner;
  3.  
  4. public class Main {
  5. public static int n, m;
  6. public static int count;
  7. public static int[] DFN;
  8. public static int[] Low;
  9. public static int[] parent;
  10. public static ArrayList<Integer>[] list;
  11. public static ArrayList<Integer> point;
  12.  
  13. @SuppressWarnings("unchecked")
  14. public void init() {
  15. count = 0;
  16. DFN = new int[n + 1];
  17. Low = new int[n + 1];
  18. parent = new int[n + 1];
  19. list = new ArrayList[n + 1];
  20. point = new ArrayList<Integer>();
  21. for(int i = 1;i <= n;i++)
  22. list[i] = new ArrayList<Integer>();
  23. }
  24.  
  25. public void TarJan(int start, int father) {
  26. DFN[start] = ++count;
  27. Low[start] = DFN[start];
  28. parent[start] = father;
  29. int childern = 0;
  30. for(int i = 0;i < list[start].size();i++) {
  31. int j = list[start].get(i);
  32. if(DFN[j] == 0) {
  33. childern++;
  34. TarJan(j, start);
  35. Low[start] = Math.min(Low[start], Low[j]);
  36. if(parent[start] == -1 && childern > 1) {
  37. if(!point.contains(start))
  38. point.add(start);
  39. }
  40. if(parent[start] != -1 && Low[j] >= DFN[start]) {
  41. if(!point.contains(start))
  42. point.add(start);
  43. }
  44.  
  45. } else if(j != parent[start]) {
  46. Low[start] = Math.min(Low[start], DFN[j]);
  47. }
  48. }
  49. }
  50.  
  51. public void dfs(int a, boolean[] visited) {
  52. visited[a] = true;
  53. for(int i = 0;i < list[a].size();i++) {
  54. int j = list[a].get(i);
  55. if(visited[j] == false)
  56. dfs(j, visited);
  57. }
  58. }
  59.  
  60. public void getResult(int a, int b) {
  61. TarJan(1, -1);
  62. int result = 0;
  63. for(int i = 0;i < point.size();i++) {
  64. if(point.get(i) == a || point.get(i) == b)
  65. continue;
  66. else {
  67. boolean[] visited = new boolean[n + 1];
  68. visited[point.get(i)] = true;
  69. dfs(a, visited);
  70. if(visited[b] == false) {
  71. result++;
  72. }
  73. }
  74. }
  75. System.out.println(result);
  76. }
  77.  
  78. public static void main(String[] args) {
  79. Main test = new Main();
  80. Scanner in = new Scanner(System.in);
  81. n = in.nextInt();
  82. m = in.nextInt();
  83. test.init();
  84. for(int i = 1;i <= m;i++) {
  85. int u = in.nextInt();
  86. int v = in.nextInt();
  87. list[u].add(v);
  88. list[v].add(u);
  89. }
  90. int a = in.nextInt();
  91. int b = in.nextInt();
  92. test.getResult(a, b);
  93. }
  94.  
  95. }

算法笔记_188:历届试题 危险系数(Java)的更多相关文章

  1. 算法笔记_177:历届试题 城市建设(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...

  2. 算法笔记_186:历届试题 高僧斗法(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...

  3. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  4. 算法笔记_172:历届试题 波动数列(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...

  5. 算法笔记_196:历届试题 剪格子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|**** ...

  6. 算法笔记_195:历届试题 错误票据(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为 ...

  7. 算法笔记_194:历届试题 翻硬币(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情 ...

  8. 算法笔记_190:历届试题 幸运数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成 . 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第 ...

  9. 算法笔记_187:历届试题 网络寻路(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任 ...

随机推荐

  1. KVM资源划分分配技巧

    kvm有个叫做超分的概念,根据这个特性可以分配出超出物理机配置的数台虚拟机. 以下是自己总结的一些划分技巧: 一.最保守方法(性能最好) 根据物理机的资源,按虚拟机的数量叠加但不超过物理机的总和.不超 ...

  2. as 汇编器

    [root@localhost ~]# cat .s .file "write.s" .section .rodata hello: .string "hello, wo ...

  3. [android]ShareSDK——内容分享和短信验证

    前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决 ...

  4. java 内存溢出 栈溢出的原因与排查方法

     1. 内存溢出的原因是什么?        内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出.如果出现这种现象可行代码排查: 一)是否App中的类中和引用变量过多使用了 ...

  5. Rational Rose、PowerDesign、Visio的一些比较

    就目前建模软件来说,Rational Rose.PowerDesign.Visio三个是比较常用的系列了,在这里对它们做一些比较,我只用过PowerDesign.Visio和一个跟Rose很像的免费工 ...

  6. 用SBT编译Spark的WordCount程序

    问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要 ...

  7. iOS开发-多线程NSOperation和NSOperationQueue

    上一篇文章稍微提及了一下NSThread的使用,NSThread能直观地控制线程对象,不过需要自己管理线程的生命周期,线程同步,用起来比较繁琐,而且比较容易出错.不过Apple给出了自己的解决方案NS ...

  8. CSS 的优先级机制总结

    一.样式优先级: 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况下,大家都认为优先级是:内联样式 > 内部样 ...

  9. http://www.cnblogs.com/snake-hand/p/3206655.html

    1 public class MainActivity extends Activity { 2 3 private ListView listView; 4 private ArrayList< ...

  10. html 中shadow DOM 的使用

    什么是shadow DOM? An important aspect of web components is encapsulation — being able to keep the marku ...