算法笔记_188:历届试题 危险系数(Java)
目录
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 3
2 3
3 4
3 5
4 5
5 6
1 6
2 解决方案
具体代码如下:
- import java.util.ArrayList;
- import java.util.Scanner;
- public class Main {
- public static int n, m;
- public static int count;
- public static int[] DFN;
- public static int[] Low;
- public static int[] parent;
- public static ArrayList<Integer>[] list;
- public static ArrayList<Integer> point;
- @SuppressWarnings("unchecked")
- public void init() {
- count = 0;
- DFN = new int[n + 1];
- Low = new int[n + 1];
- parent = new int[n + 1];
- list = new ArrayList[n + 1];
- point = new ArrayList<Integer>();
- for(int i = 1;i <= n;i++)
- list[i] = new ArrayList<Integer>();
- }
- public void TarJan(int start, int father) {
- DFN[start] = ++count;
- Low[start] = DFN[start];
- parent[start] = father;
- int childern = 0;
- for(int i = 0;i < list[start].size();i++) {
- int j = list[start].get(i);
- if(DFN[j] == 0) {
- childern++;
- TarJan(j, start);
- Low[start] = Math.min(Low[start], Low[j]);
- if(parent[start] == -1 && childern > 1) {
- if(!point.contains(start))
- point.add(start);
- }
- if(parent[start] != -1 && Low[j] >= DFN[start]) {
- if(!point.contains(start))
- point.add(start);
- }
- } else if(j != parent[start]) {
- Low[start] = Math.min(Low[start], DFN[j]);
- }
- }
- }
- public void dfs(int a, boolean[] visited) {
- visited[a] = true;
- for(int i = 0;i < list[a].size();i++) {
- int j = list[a].get(i);
- if(visited[j] == false)
- dfs(j, visited);
- }
- }
- public void getResult(int a, int b) {
- TarJan(1, -1);
- int result = 0;
- for(int i = 0;i < point.size();i++) {
- if(point.get(i) == a || point.get(i) == b)
- continue;
- else {
- boolean[] visited = new boolean[n + 1];
- visited[point.get(i)] = true;
- dfs(a, visited);
- if(visited[b] == false) {
- result++;
- }
- }
- }
- System.out.println(result);
- }
- public static void main(String[] args) {
- Main test = new Main();
- Scanner in = new Scanner(System.in);
- n = in.nextInt();
- m = in.nextInt();
- test.init();
- for(int i = 1;i <= m;i++) {
- int u = in.nextInt();
- int v = in.nextInt();
- list[u].add(v);
- list[v].add(u);
- }
- int a = in.nextInt();
- int b = in.nextInt();
- test.getResult(a, b);
- }
- }
算法笔记_188:历届试题 危险系数(Java)的更多相关文章
- 算法笔记_177:历届试题 城市建设(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...
- 算法笔记_186:历届试题 高僧斗法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...
- 算法笔记_183:历届试题 九宫重排(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...
- 算法笔记_172:历届试题 波动数列(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...
- 算法笔记_196:历届试题 剪格子(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|**** ...
- 算法笔记_195:历届试题 错误票据(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为 ...
- 算法笔记_194:历届试题 翻硬币(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情 ...
- 算法笔记_190:历届试题 幸运数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成 . 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第 ...
- 算法笔记_187:历届试题 网络寻路(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任 ...
随机推荐
- KVM资源划分分配技巧
kvm有个叫做超分的概念,根据这个特性可以分配出超出物理机配置的数台虚拟机. 以下是自己总结的一些划分技巧: 一.最保守方法(性能最好) 根据物理机的资源,按虚拟机的数量叠加但不超过物理机的总和.不超 ...
- as 汇编器
[root@localhost ~]# cat .s .file "write.s" .section .rodata hello: .string "hello, wo ...
- [android]ShareSDK——内容分享和短信验证
前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决 ...
- java 内存溢出 栈溢出的原因与排查方法
1. 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出.如果出现这种现象可行代码排查: 一)是否App中的类中和引用变量过多使用了 ...
- Rational Rose、PowerDesign、Visio的一些比较
就目前建模软件来说,Rational Rose.PowerDesign.Visio三个是比较常用的系列了,在这里对它们做一些比较,我只用过PowerDesign.Visio和一个跟Rose很像的免费工 ...
- 用SBT编译Spark的WordCount程序
问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要 ...
- iOS开发-多线程NSOperation和NSOperationQueue
上一篇文章稍微提及了一下NSThread的使用,NSThread能直观地控制线程对象,不过需要自己管理线程的生命周期,线程同步,用起来比较繁琐,而且比较容易出错.不过Apple给出了自己的解决方案NS ...
- CSS 的优先级机制总结
一.样式优先级: 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况下,大家都认为优先级是:内联样式 > 内部样 ...
- http://www.cnblogs.com/snake-hand/p/3206655.html
1 public class MainActivity extends Activity { 2 3 private ListView listView; 4 private ArrayList< ...
- html 中shadow DOM 的使用
什么是shadow DOM? An important aspect of web components is encapsulation — being able to keep the marku ...