zoukankan      html  css  js  c++  java
  • 蓝桥杯 危险系数

    问题描述

    抗日战争时期,冀中平原的地道战曾发挥重要作用。地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。

    我们来定义一个危险系数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
    分析这是一道看似求割点的题目,其实不然,他不完全是求割点,仔细分析就知道。
    我的思路是求出u,v之间的不同的路径的个数(并且统计每个节点在路径上用的次数)。
    那么就有如果某个节点用的次数等于路径数,那么说明该点一旦去除,那么u,v就不能连通,也就是所谓的割点。
    贴上代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define Max 1005
     4 
     5 using namespace std;
     6 int n,m;
     7 bool visit[Max];
     8 int bian,ans,luxian;
     9 int way[Max],geshu[Max];
    10 struct Node
    11 {
    12     int to,next;
    13 }edge[2*Max];
    14 int head[Max];
    15 void add(int u,int v)
    16 {
    17     edge[++bian].to=v;
    18     edge[bian].next=head[u];
    19     head[u]=bian;
    20 }
    21 void dfs(int u,int v,int k)
    22 {
    23     int i;
    24     way[k]=u;
    25     visit[u]=true;
    26     if(u==v){
    27         luxian++;
    28         for(i=1;i<=k;i++)
    29             geshu[way[i]]++;
    30         return ;
    31     }
    32     for(i=head[u];i!=-1;i=edge[i].next){
    33         int j=edge[i].to;
    34         if(!visit[j]){
    35             dfs(j,v,k+1);
    36             visit[j]=false;
    37         }
    38     }
    39 }
    40 int main()
    41 {
    42     memset(head,-1,sizeof(head));
    43     memset(geshu,0,sizeof(geshu));
    44     memset(visit,false,sizeof(visit));
    45     bian=ans=luxian=0;
    46     int u,v;
    47     scanf("%d%d",&m,&n);
    48     while(n--){
    49         scanf("%d%d",&u,&v);
    50         add(u,v);
    51         add(v,u);
    52     }
    53     scanf("%d%d",&u,&v);
    54     dfs(u,v,1);
    55     for(int i=1;i<=m;i++) if(i!=u && i!=v && geshu[i]==luxian) ans++;
    56     printf("%d
    ",ans);
    57     return 0;
    58 }
    View Code
  • 相关阅读:
    恭喜发财
    狗腿子的一天
    向系统分析员爬进
    解决SqlTransaction用尽的问题
    Localhost与数据库连接
    《成都,今夜请将我遗忘》读后感
    如何快速掌握一门技术
    怎样做一个iOS App的启动分层引导动画?
    怎么去掉Xcode工程中的某种类型的警告
    iOS 8 AutoLayout与Size Class自悟
  • 原文地址:https://www.cnblogs.com/bokezhilu/p/3599165.html
Copyright © 2011-2022 走看看