题目链接:P8604 [蓝桥杯 2013 国 C] 危险系数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目大意:
- 共有 n 个点,m 个通道(无向)。
- 给出起点 u ,终点 v。求这两点之间,有多少个点删去后就能使这两点不连通。
- 如果 u 和 v 之间没有路径连通,输出-1。
解题思路:可以使用 dfs求解,求出 u 到 v 间的每一条路径,将路径总数统计,并将被经过的点被经过总数加一。如果一个点被经过的次数与总路径条数相等,那么这一个点就是 u 和 v 的关键点,并且最后的减一是减去起点。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N = 2020;
int n,m;
int d[N][N];
int b[N];
int v[N];
int t1,t2;
int cnt,ans;
void dfs(int y){
if(y==t2){
cnt++;
for(int i=1;i<=n;i++){
if(b[i]==0){
v[i]++;
}
}
return;
}
for(int i=1;i<=n;i++){
if(d[y][i]!=0&&b[i]!=0){
b[i]=0;
dfs(i);
b[i]=-1;
}
}
}
signed main()
{
cin >> n >> m;
for(int i=1;i<=m;i++){
int x,y;
cin >> x >> y;
d[x][y]=1;
d[y][x]=1;
}
cin >> t1 >> t2;
memset(b,-1,sizeof b);
dfs(t1);
for(int i=1;i<=n;i++){
if(v[i]==cnt){
ans++;
}
}
if(cnt>0){
cout << ans-1;
}
else{
cout << -1;
}
}