测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40897. 危险系数

填空题 困难

题目描述

危险系数

题目描述

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

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

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

对于两个站点 x 和 y (x != y),如果能找到一个站点 z,当 z 被敌人破坏后,x 和 y 不连通,那么我们称 z 为关于 x, y 的关键点。

相应的,对于任意一对站点 x 和 y,危险系数 DF(x, y) 就表示为这两点之间的关键点个数。

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

输入格式

第一行包含 2 个整数 n, m,分别代表站点数,通道数;

接下来 m 行,每行两个整数 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 ≤ n ≤ 1000

0 ≤ m ≤ 2000

参考答案

#include <iostream> #include <cstring> using namespace std; const int N = 1010, M = 2020; bool st[N]; int n, m, u, v, ans, cnt[N]; int h[N], e[M], ne[M], idx; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx ++; } void dfs(int u) { if(u == v) { ans ++; // 路径数量 for (int i = 1; i <= n; i ++) if(st[i]) cnt[i] ++; // 路径上的点 +1 return; } for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if(st[j]) continue; st[j] = true; dfs(j); st[j] = false; } } int main() { cin >> n >> m; memset(h, -1, sizeof h); for (int i = 1; i <= m; i ++) { int a, b; cin >> a >> b; add(a, b); add(b, a); } cin >> u >> v; st[u] = true; dfs(u); int s = 0; for (int i = 1; i <= n; i ++) if(ans == cnt[i]) s ++; // 关键点:点数与路径数相同 if(!s) cout << -1 << endl; else cout << s - 2 << endl; // 减去起点和终点 }
上一题 下一题