抗日战争时期,冀中平原的地道战曾发挥重要作用。
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数 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)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
使用 dfs
求出 u 到 v 间的每一条路径,将路径总数统计,并将被经过的点被经过总数加一。
如果一个点被经过的次数与总路径条数相等,那么这一个点就是 u 和 v 的关键点。
#include
using namespace std;
int n,m,u,v,ans,cnt[1005],sum,li[1005][1005],f[1005];
void dfs(int t)
{
if(t==v) {
sum++;//路径数++
for(int i=1;i<=n;i++) {
if(f[i]==1) cnt[i]++;//走过的点++
}
}
else {
for(int i=1;i<=n;i++) {
if(li[t][i]==1&&f[i]==0) {
f[i]=1;
dfs(i);
f[i]=0;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i>u>>v;
li[u][v]=li[v][u]=1;//存储联不联通即可
}
cin>>u>>v;
dfs(u);
if(sum>0) {
for(int i=1;i<=n;i++)
{
if(cnt[i]==sum) ans++;
}
cout<