蓝桥杯2013年第四届真题 危险系数
发布日期:2021-05-08 16:24:39 浏览次数:21 分类:精选文章

本文共 1931 字,大约阅读时间需要 6 分钟。

在实际开发过程中,我们常常需要解决图中的路径问题。特别是当我们需要计算从图的某个起点到终点的所有可能路径数时,深度优先搜索(DFS)是一种非常有效的方法。通过DFS,我们不仅可以统计路径的数量,还可以找出在所有路径中被访问次数等于总路径数的关键点。

代码解析

#include 
using namespace std;int map[1001][1001]; // 邻接矩阵int path[1001]; // 存储路径int vis[1001]; // 当前结点标志位int times[1001]; // 存储结点经过的次数int num = 0, v; // num表示路径的数量,v表示终点void DFS(int u, int n) { if (u == v) { // 到达终点 num++; // 路径数量加1 for (int i = 1; i <= n; i++) { if (path[i]) { times[i]++; // 每个经过的结点次数加1 } } } for (int i = 1; i <= n; i++) { if (map[u][i] == 1 && vis[i] == 0) { vis[i] = 1; path[i] = 1; DFS(i, n); vis[i] = 0; // 考虑后面还可能会经过i结点,所以要重新设置为0 path[i] = 0; } }}int main() { int count = 0, m, n, u; for (int i = 0; i < 1001; i++) { vis[i] = path[i] = times[i] = 0; for (int j = 0; j < 1001; j++) map[i][j] = 0; } cin >> n >> m; for (int i = 0; i < 1001; i++) { cin >> u >> v; map[u][v] = map[v][u] = 1; } cin >> u >> v; DFS(u, n); if (num) { for (int i = 1; i <= n; i++) { if (times[i] == num && i != u && i != v) { // 当路径数量和结点的次数相同,且结点不是起点和终点 count++; } } cout << count << endl; } return 0;}

代码功能解释

  • 邻接矩阵map是一个二维数组,用于存储图的邻接信息。map[u][i]表示节点u可以直接到达节点i

  • 访问标记和路径标记vis数组用于记录当前结点是否已被访问,避免重复访问。path数组用于记录当前路径中的结点,方便后续处理。

  • 路径计数num变量用于存储从起点到终点的路径总数。

  • 关键点判定times数组用于记录每个结点在所有路径中被访问的总次数。通过比较times[i]num,可以找出关键点。

  • 代码运行流程

  • 初始化:在main函数中,首先将所有节点的访问标记、路径标记和访问次数初始化为0,并将邻接矩阵初始化为空。

  • 读取输入:读取图的节点数n和边数m。然后读取m条边信息,并更新邻接矩阵。

  • DFS搜索:调用DFS(u, n),从起点u开始进行深度优先搜索。

  • 计算关键点:在DFS找到终点v后,统计所有路径数,并计算每个结点的访问次数。最后,找出访问次数等于路径数且不是起点和终点的关键点,输出关键点的数量。

  • 关键点判定逻辑

  • 路径数num:当DFS第一次到达终点v时,num增加1,表示有一条完整的路径。

  • 关键点判断:在所有路径完成后,遍历所有节点。如果某个节点的访问次数等于路径数且不是起点和终点,则该节点是关键点。

  • 这种方法通过DFS遍历所有可能的路径,确保每条路径都被统计,并通过访问次数找出关键点。这种方法在图论问题中非常常见,能够有效解决路径计数和关键点识别问题。

    上一篇:蓝桥杯 2016c/c++A组 方格填数
    下一篇:蓝桥杯历届试题-回文数字(学习到了如何得到一个数字的每个位的数字情况)

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月07日 10时51分05秒