洛谷 P2296 寻找道路 dijkstra 反向建图 存图的vector e[]数组作为函数参数传入

该博客详细介绍了洛谷P2296问题的解决方案,主要使用了Dijkstra算法的变形。首先通过反向建图找到不可达的起点,然后利用vis数组在正向图搜索中排除这些点,确保最短路径的正确性。博主还提到了如何将vector<pair<int, int>> e[]作为函数参数传递,以及vis数组在解决问题中的关键作用。博客内容包含两次Dijkstra算法的实现,一次是未将边数组作为参数,另一次是优化后的版本。" 112669965,10537082,Big-Little Net:多尺度特征表示在视觉与语音识别中的应用,"['深度学习', '计算机视觉', '语音识别', '神经网络', '模型结构']
摘要由CSDN通过智能技术生成

题目链接:

https://www.luogu.com.cn/problem/P2296

算法:

dijkstra变形

思路:

1:存图时,也反向存一份,因为题目要求所求最短路径上的点的连接点也必须可以到达终点t,因此先从终点t跑反向图,找到此时的d[i]为1e9,即不可达,那么在反向图中,这些点所指向的点就是正向图中,不可以走的点,将这些点用vis[]数组标记,然后跑正向图的时候就利用vis数组的值把不能出现在所求的最短路径上的点排除在外

2:第一次ac时,因为不知道如何把vector<pair<int,int> >e[maxn]作为函数的参数传入,所以dijkstra函数写了两个版本,写了两遍,查百度之后发现,其可以作为函数参数传入,改进了代码

3:也要特别注意vis[]数组在巧妙解决第二遍dijkstra排除不能出现在最短路径上的点的时候的关键作用

一:两个dijkstra函数

#include <bits/stdc++.h>

using namespace std;
const int maxn=1e4+1;
vector<pair<int,int> >e[maxn];
vector<pair<int,int> >mapp[maxn];
int n,m,s,t,a,b,d[maxn],vis[maxn];

void init()
{
    for(int i&#
### 论中的方法 在论领域,是解决实际问题的基础步骤。以下是关于如何实现这些方法的具体描述。 #### 1. **邻接矩阵储** 邻接矩阵是一种常见的储方式,适用于稠密(即边数较多的)。它通过二维数组 `adj_matrix` 来表示顶点之间的关系。如果在从顶点 `i` 到顶点 `j` 的边,则设置 `adj_matrix[i][j] = weight`,其中 `weight` 是边权值;如果没有边则通常设为无穷大或零[^1]。 对于无向而言,由于每条边双向连通,因此其邻接矩阵是对称阵。而有向不需要保持这种对称性质。 ```python def create_adjacency_matrix(n, edges): adj_matrix = [[0]*n for _ in range(n)] for u, v, w in edges: adj_matrix[u][v] = w return adj_matrix ``` #### 2. **邻接表储** 相比起邻接矩阵占用较大的空间复杂度 O(V²),当处理稀疏时更推荐使用邻接表形式来节省内资源消耗。这里采用字典或者列表嵌套的方式记录每个节点所关联的所有其他节点以及对应权重信息[^2]。 ```python from collections import defaultdict def create_adjacency_list(edges): adj_list = defaultdict(list) for u, v, w in edges: adj_list[u].append((v, w)) return dict(adj_list) ``` 上述代码片段展示了创基于 Python 字典的数据结构作为邻接表的例子。每一项键代表某个特定顶点编号,而对应的值是一个元组组成的列表,包含相邻顶点及其相连路径上的代价参数。 #### 3. **加边操作** 无论是哪种储方案,在构过程中都需要支持动态增加新边的功能。具体做法如下: - 对于**邻接矩阵**来说只需更新相应位置处数值即可; - 若采取的是**邻接表**策略,则需将目标顶点加入源顶点指向的目标集合里去[^3]。 #### 4. **遍历功能** 为了能够方便地访问任意给定结点所能直达的一切邻居们,必须提供有效的迭代机制。这一步骤尤其重要因为它是后续诸如广度优先搜索(BFS), 深度优先搜索(DFS) 或者 Dijkstra 最短路算法执行的前提条件之一[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值