• 历届试题 危险系数-(dfs+记录路径)


     历届试题 危险系数  
    问题描述

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

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

    我们来定义一个危险系数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
    思路:一直用dfs记录点访问过的次数,一路wa后才知道,记录的应该是能够从起点搜到终点的路径,这条路径上的点才是有效访问的点。通过关键点的次数 = 搜到路径的次数,表示,想要通向终点,必然要路过这个点。
     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<math.h>
     6 #include<string>
     7 #include<map>
     8 #include<queue>
     9 #include<stack>
    10 #include<set>
    11 #define ll long long
    12 #define inf 0x3f3f3f3f
    13 using namespace std;
    14 
    15 int n,m;
    16 vector<int>a[10086];
    17 bool vis[10086];
    18 int num[10086];
    19 int way[10086];
    20 int s,e;
    21 bool flag;
    22 int cnt=0;
    23 
    24 void dfs(int x,int step)///当前点,步数
    25 {
    26     way[step]=x;///这一步数的点是x,如果没有搜到,重新搜索时候会覆盖路径
    27     if(x==e)
    28     {
    29         flag=true;
    30         cnt++;
    31         for(int i=0;i<=step;i++)///深搜到终点作为一条完整的路径,这条路径共s步,把经过点的次数+1
    32             num[ way[i] ]++;
    33         return;
    34     }
    35     for(int i=0;i<a[x].size();i++)
    36     {
    37         int to=a[x][i];
    38         if(!vis[to])///对没有访问过的点进行搜索
    39         {
    40             vis[to]=true;
    41             dfs(to,step+1);
    42             vis[to]=false;
    43         }
    44     }
    45 }
    46 
    47 
    48 int main()
    49 {
    50     memset(vis,false,sizeof(vis));
    51     scanf("%d%d",&n,&m);
    52     while(m--)
    53     {
    54         int x,y;
    55         scanf("%d%d",&x,&y);
    56         a[x].push_back(y);
    57         a[y].push_back(x);
    58     }
    59     scanf("%d%d",&s,&e);
    60     vis[s]=true;
    61     dfs(s,0);
    62     int ans=0;
    63     if(flag)
    64     {
    65         for(int i=1;i<=n;i++)
    66         {
    67             if(i==s || i==e)
    68                 continue;
    69             if(num[i]==cnt)///计数
    70                 ans++;
    71         }
    72     }
    73     else
    74         ans=-1;
    75     printf("%d
    ",ans);
    76     return 0;
    77 }
  • 相关阅读:
    js正则表达式大全(2)
    Magic Trackpad 2 on win10 x64
    Google 日历短信通知没有了
    Ueditor 1.4.3 jsp utf-8版Bug修复
    [转]eclipse中build workspace的相关优化
    Hello,
    EpCloud开发日志
    为服务创建安装程序
    winform 通过WCF上传Dataset数据
    opcrcw.da.dll 和.net 4.0
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11351401.html
Copyright © 2020-2023  润新知