首页 > 其他分享 >[蓝桥杯 2013 国 C] 危险系数 dfs 深搜 递归

[蓝桥杯 2013 国 C] 危险系数 dfs 深搜 递归

时间:2024-03-26 15:01:24浏览次数:35  
标签:站点 le int dfs 蓝桥 vis ## 2013

## 题目背景

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

## 题目描述

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

我们来定义一个危险系数 $DF(x,y)$:

对于两个站点 $x$ 和 $y(x\neq y),$ 如果能找到一个站点 $z$,当 $z$ 被敌人破坏后,$x$ 和 $y$ 不连通,那么我们称 $z$ 为关于 $x,y$ 的关键点。相应的,对于任意一对站点 $x$ 和 $y$,危险系数 $DF(x,y)$ 就表示为这两点之间的关键点个数。

本题的任务是:已知网络结构,求两站点之间的危险系数。

## 输入格式

输入数据第一行包含 $2$ 个整数 $n(2 \le n \le 1000)$,$m(0 \le m \le 2000)$,分别代表站点数,通道数。

接下来 $m$ 行,每行两个整数 $u,v(1 \le u,v \le n,u\neq v)$ 代表一条通道。

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

## 输出格式

一个整数,如果询问的两点不连通则输出 $-1$。

## 样例 #1

### 样例输入 #1

```
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
```

### 样例输出 #1

```
2
```

## 提示

时限 1 秒, 64M。蓝桥杯 2013 年第四届国赛

这题我写的时候思路有,但是代码实现的时候有一个小细节错了,导致全盘皆输55555555555

下面带着大家一起做:

        读完题,首先我们会发现题目给了一个网络,也就是一张图,然后一看题目所给的数据量也不大,完全可以用深搜dfs,确定好算法,然后具体分析题目要求。

        题目要求找初危险中间节点——也就是去除以后就让图中两点不连通的点。仔细想想,哪些点是不可以去除的中间节点!!聪明的你肯定知道了,如果A -> B, 我们不管走哪一条路径,如果都会通过C,那么C一定是不可去除的!!!所以我们只需要 dfs 找出所有的可达路径,然后把每一条路径的经过点的次数都用sum[]数组记录下来(但是起点和终点不能记录,因为起点终点不是中间节点),只需要for循环查找所有的点,输出与可达路径相同的经过点的数量即可。

知道这个以后,我们就可以写dfs函数了。

!!!

dfs()函数的要点:

        1.有vis[]数组

        2.进函数之前先将初始点设置为vis[] = true

        3.函数内部设置终止条件,即cur = v

        4.递归查找前,设置当前点为true,之后,需要回溯,设置当前点为false未访问

        5.为保证良好习惯,在main函数内部调用完dfs()之后,也需要设置初始点为false

        

代码:

        

#include<bits/stdc++.h>
using namespace std;
bool vis[5000];
int sum[5000];
vector<int> a[1005];
int ans = 0;//表示两点的路径数量 
int num = 0;//表示最终结果,危险节点 
int m, n;//m个站点,n条边 
int u,v;
void dfs(int cur)
{
    if(cur == v)//如果查找到终点,就把这条路径上所有访问过的点的访问次数加一 
    {
        ans++;
        for(int i = 1; i <= m; i++)
        {
            if(vis[i])
            {
                sum[i]++;
            }
        }
        sum[v] = 0;//但是终点不能设置,因为终点不是危险点 
        sum[u] = 0;//起点也不能设置,因为起点不是危险点 
        return;
    }
    for(int i = 0; i < a[cur].size(); i++)
    {
        int j = a[cur][i];
        if(vis[j])
        {
            continue;
        } 
        
        vis[j] = true;
        dfs(j);
        
        vis[j] = false;
        
    }

 
int main()
{

    cin >> m >> n;
    for(int i = 1; i <= n; i++)
    {
        int x, y;
        cin >> x >> y;
        a[x].push_back(y);
        a[y].push_back(x);
    }

    cin >> u >> v;
    vis[u] = true; 
    dfs(u);
    vis[u] = false;
    for(int i = 1; i <= m; i++)
    {
        if(sum[i] == ans)
        {
            num++; 
        } 
    }
    if(ans == 0)//如果路径数量为0,表明不连通 
    {
        cout << "-1"; 
    }
    else cout << num  ;
    return 0;
}

标签:站点,le,int,dfs,蓝桥,vis,##,2013
From: https://blog.csdn.net/Chris_1989/article/details/137045985

相关文章

  • HDFS原理介绍
    1.分布式分布式存储解决了单机存储容量有限的问题,且带来了比较高的性能提升.例如:3台服务器,就是3倍的传输效率,读写效率...横向扩展=加机器, 纵向扩展=加配置(硬件)2.架构  namenode:主节点.    1.管理整个HDFS集群.    2.维护和管......
  • 十一 2060. 奶牛选美 (DFS)
    十一2060.奶牛选美(DFS)思路:使用dfs找出两个相邻的斑点,搜索过的点改为'.'防止重复统计,然后依次遍历两个斑点内的点,找出最小曼哈顿距离。importjava.util.*;publicclassMain{staticintn,m;staticchar[][]g;staticList<int[]>[]points=newAr......
  • Hadoop:HDFS配置与基本命令
    接上篇Hadoop的单机布署,接下来准备以单机的形式体验一把HDFS。 写在前而,我本机hadoop的根目录是/hadoop/hadoop-2.10.2,请各位读者根据实际情况辨别各自的路径。第一步,修改配置文件/hadoop/hadoop-2.10.2/etc/hadoop/core-site.xml<configuration><property>......
  • 迷宫与陷阱(蓝桥杯)
    文章目录迷宫与陷阱问题描述bfs迷宫与陷阱问题描述小明在玩一款迷宫游戏,在游戏中他要控制自己的角色离开一间由NxN个格子组成的2D迷宫。小明的起始位置在左上角,他需要到达右下角的格子才能离开迷宫,每一步,他可以移动到上下左右相邻的格子中。迷宫中有些格子小......
  • 蓝桥杯刷题(十四)
    1.小平方代码n=int(input())count=0deff(x)->bool:#判断条件returnTrueifx**2%n<n/2elseFalseforiinrange(1,n):#遍历[1,n-1],符合题意计数加一iff(i):count+=1print(count)2.3的倍数代码a=int(input())b=int(input())......
  • 蓝桥杯算法基础(29)字符串匹配(RabinKarp)(KMP)(前缀树,字典树,trie,后缀数组,高度数组)
     RabinKarpRabinKarpS:ABABABm个P:ABBn个1.朴素算法,挨个匹配2.哈希法hash->滚动哈希c0*31^2+c1*31^1+c2类似于进制的求法求hash值(c0*31+c1)*31+c2hash(p)=o(n)hash(s)=o(m*n)privatestaticvoidmatch(Stringp,Strings){longhash_p=hash(p);......
  • 蓝桥杯n皇后问题C++
    用到了dfs算法#include<iostream>usingnamespacestd;intn;inta[10][10]={0};intsum=0;voidprin(inta[][10]){for(inti=0;i<n;i++){for(intj=0;j<n;j++){cout<<a[i][j]<......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • 蓝桥杯练习题——博弈论
    1.必胜态后继至少存在一个必败态2.必败态后继均为必胜态Nim游戏思路23,先手必赢,先拿1,然后变成22,不管后手怎么拿,先手同样操作,后手一定先遇到00a1^a2^a3…^an=0,先手必败,否则先手必胜#include<iostream>usingnamespacestd;constintN=1e5+1......
  • C++ | 剪枝(DFS)lanqiao OJ 2942
     上一篇我们已经分享了DFS的学习,剪枝相当于对部分DFS进行优化正常用DFS写,会遍历每一种情况,因此要判断他的合法性,并且在第十个检测点会超时,用剪枝后,这道题就可以过啦。//不剪枝的方法#include<bits/stdc++.h>usingnamespacestd;constintN=15;inta[N],n;v......