试题 历届试题 危险系数

资源限制
时间限制:1.0s   内存限制:256.0MB
 
问题描述

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

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

我们来定义一个危险系数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)代表一条通道;

最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。

输出格式
一个整数,如果询问的两点不连通则输出-1.
 
样例输入
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
 
样例输出
2
 
 
这题用深搜就可,先深搜判断询问的两点间是否连通(因为1 <= u, v <= n,所以令要排除测试的点为0即可判断),若连通,则一个个点做排除测试,若排除该点后可行路径数为0,那么说明这是一个关键点,危险系数df加一. 注意剪枝,一旦发现该点不是关键点,就直接终止测试.
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <map>
 8 #include <algorithm>
 9 #define INF 0x3f3f3f3f
10 #define zero 1e-7
11 
12 using namespace std;
13 typedef long long ll;
14 const ll mod=1e9+7;
15 const ll max_n=1005;
16 
17 struct node {
18     int u, v;
19 }e[max_n<<1];
20 
21 int n, m;//站点数,通道数 
22 int su, sv;//询问的两点  
23 int ans=0;//排除某点后可行的路径数 
24 bool vis[max_n]={false};//标记是否访问过
25 bool flag[max_n]={false};//标记改点是否排除测试过 
26 
27 void dfs(int s, int del) {//源点,要排除测试的点 
28     vis[s]=true; 
29     for(int i=0; i<m; i++) {
30         if(e[i].u==s && !vis[e[i].v] && e[i].v!=del) {
31             if(e[i].v==sv) 
32                 ans++;
33             else 
34                 dfs(e[i].v, del);
35         }
36         if(e[i].v==s && !vis[e[i].u] && e[i].u!=del) {
37             if(e[i].u==sv) 
38                 ans++;
39             else 
40                 dfs(e[i].u, del);
41         }
42         if(ans) return;//一旦找到排除点del后仍能使询问的两点连通的路径,即del不是关键点,则直接终止测试 
43     } 
44     vis[s]=false;
45 }
46 
47 int main() {
48     cin>>n>>m;
49     int df=0;
50     for(int i=0; i<m; i++) {
51         cin>>e[i].u>>e[i].v;
52     }
53     cin>>su>>sv;
54     dfs(su, 0);//先判断不排除任何点时,询问的两点是否连通 
55     if(!ans) df=-1;//若询问的两点不连通则令df=-1 
56     else {
57         for(int i=1; i<=n; i++) {
58             ans=0;
59             if(i!=su && i!=sv && !flag[i]) {
60                 flag[i]=true;
61                 memset(vis, false, sizeof vis);//注意要重新初始化 
62                 dfs(su, i);
63                 if(!ans) df++;
64             }
65         }
66     }
67     cout<<df<<endl;
68     return 0;
69 }
70 /*
71 5 4
72 1 3
73 2 3
74 1 4
75 4 5
76 2 5
77 
78 3
79 */
 
原文地址:https://www.cnblogs.com/wwqzbl/p/13579670.html