【SPFA】桐人的约会
发布日期:2021-05-07 22:48:54 浏览次数:20 分类:精选文章

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

为了解决这个问题,我们需要找到从1号街区到N号街区的所有可能的最短路径中最长的那条路径。亚丝娜会选择最短的路径,但我们需要找出在这些路径中最长的那条。

方法思路

  • 问题分析:我们需要找到从1号街区到N号街区的最短路径中的最大值。这个问题可以通过多次剪枝最短路径中的边来解决。
  • SPFA算法:使用SPFA算法来处理有向图中的单源最短路径问题。SPFA算法在每次处理一个节点时,将其未处理的邻居加入队列中,重复这个过程直到队列为空。
  • 剪枝最短路径:首先运行SPFA算法,找到从1号到各节点的最短距离。然后,找出所有属于这些最短路径的边,并将这些边从图中去掉。重复这个过程,直到没有更多的边可以剪枝为止。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;int n, m;int dist[1001];int inqueue[1001];int out[1001];int adj[1001][1001];int edge_count = 0;struct Edge { int to, weight, next;};void spfa(int x) { int u, v, w, t, len = 0; queue
    q; for (int i = 1; i <= n; ++i) dist[i] = -1; dist[1] = 0; q.push(1); inqueue[1] = 1; while (!q.empty()) { u = q.front(); q.pop(); inqueue[u] = 0; for (int i = out[u]; i; ++i) { v = adj[u][i]; w = adj[u][i].weight; if (dist[v] == -1 || dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (inqueue[v] == 0) q.push(v); inqueue[v] = 1; } } }}int main() { scanf("%d %d", &n, &m); out[0] = m + 1; for (int i = 1; i <= m; ++i) { int a, b, c; scanf("%d %d %d", &a, &b, &c); adj[a][++edge_count] = {b, c, out[b]}; adj[b][++edge_count] = {a, c, out[a]}; } spfa(0); int ans = dist[n]; return ans;}

    代码解释

  • 读取输入:读取街区数目N和道路数目M,然后读取每条道路的信息。
  • 初始化邻接表:使用邻接表存储每个节点的邻居和边的信息。
  • SPFA算法:运行SPFA算法,计算从1号街区到各节点的最短距离。
  • 剪枝最短路径:通过多次运行SPFA算法,剪枝最短路径中的边,直到没有更多的边可以剪枝为止。
  • 输出结果:输出从1号街区到N号街区的最大最短路径的时间。
  • 这个方法确保了我们在多次剪枝后,找到了最长的最短路径,从而解决了问题。

    上一篇:【最小环】【图论】观光旅游
    下一篇:【规律】【模拟】小X的矩阵

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月16日 11时15分37秒