抗日战争时期,冀中平原的地道战曾发挥重要作用。
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数 DF(x,y)DF(x,y):
对于两个站点 xx 和 y\ (x != y)y (x!=y), 如果能找到一个站点 zz,当 zz 被敌人破坏后,xx 和 yy 不连通,那么我们称 zz 为关于 x,yx,y 的关键点。相应的,对于任意一对站点 xx 和 yy,危险系数 DF(x,y)DF(x,y) 就表示为这两点之间的关键点个数。
本题的任务是:已知网络结构,求两站点之间的危险系数。
输入数据第一行包含 2 个整数 n\ (2 \leq n \leq 1000), m\ (0 \leq m \leq 2000)n (2≤n≤1000),m (0≤m≤2000),分别代表站点数,通道数;
接下来 mm 行,每行两个整数 u,v\ (1 \leq u, v \leq n, u != v)u,v (1≤u,v≤n,u!=v) 代表一条通道;
最后 1 行,两个数 u,vu,v,代表询问两点之间的危险系数 DF(u, v)DF(u,v)。
输出一个整数,如果询问的两点不连通则输出 -1.
示例
输入
- 7 6
- 1 3
- 2 3
- 3 4
- 3 5
- 4 5
- 5 6
- 1 6
输出
2
===========================================
- import java.util.Scanner;
-
- public class Main {
- static int[][] maps = null;
- static int n, m, start, end, ways = 0, result = 0;
- static int[] visit, num;
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Scanner sc = new Scanner(System.in);
- n = sc.nextInt();// 站点数
- m = sc.nextInt();// 通道数
- maps = new int[n + 1][n + 1];// 保存地图
- visit = new int[n + 1];//保存已经访问过的节点
- num = new int[n + 1]; //保存每个节点在所有路径方案上出现的次数
- for (int i = 0; i < m; i++) {
- int a = sc.nextInt();
- int b = sc.nextInt();
- maps[a][b] = 1;
- maps[b][a] = 1;
- }
- start = sc.nextInt();
- end = sc.nextInt();
- visit[start] = 1;
- // 获取ways -- 路径数
- dfs(start);
- for (int i = 1; i <= n; i++) {
- if (i != start && i != end) {
- // 如果经过节点的路径=路径数 就是关键节点
- if (num[i] == ways) {
- result++;
- }
- }
- }
- System.out.print(result);
- }
-
- /**
- * 以cur为起点到终点的方案数
- * @param cur
- * @return
- */
- public static int dfs(int cur) {
- int findEndnum = 0; //保存这个节点后面的方案数
- for (int i = 1; i <= n; i++) {
- if ((visit[i] == 0) && (maps[cur][i] == 1)) {
- visit[i] = 1;
- if (i == end) {
- ways += 1;
- findEndnum += 1; //如果cur节点能直接到达终点,数量加1
- } else {
- findEndnum += dfs(i);//得到节点后面的所有能够达到终点的路径种数(除了直接到达哪一种)
- }
- visit[i] = 0; //回溯
- }
- }
- num[cur] += findEndnum; //得到这个节点之后能到达终点的所有方案数量
- return findEndnum;
- }
- }