危险系数-蓝桥杯2013国 C

题目描述

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

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

我们来定义一个危险系数 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<

你可能感兴趣的:(算法,数据结构,蓝桥杯)