热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HNUOJ13375花径问题(SPFA算法)

本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。

题目链接:HNUOJ 13375

任务描述:给定一个带权图,需要找到从起点到终点的所有最短路径,并计算这些路径的权重总和。

解决方案:利用SPFA(Shortest Path Faster Algorithm)算法来寻找最短路径,并在过程中记录每条路径的信息,最后汇总所有最短路径的权重。

以下是C++实现代码:

#include 
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define MAXN 10010
#define MOD 10009
using namespace std;

struct Edge {
int to, weight;
Edge(int t, int w) : to(t), weight(w) {}
};

vector edges[MAXN];
bool visited[MAXN];
int distance[MAXN];
vector paths[MAXN];

void addEdge(int from, int to, int weight) {
edges[from].emplace_back(to, weight);
}

void spfa(int start) {
memset(visited, false, sizeof(visited));
fill(distance, distance + MAXN, INF);
queue q;
q.push(start);
distance[start] = 0;
visited[start] = true;
while (!q.empty()) {
int current = q.front();
q.pop();
visited[current] = false;
for (auto &e : edges[current]) {
if (distance[e.to] > distance[current] + e.weight) {
distance[e.to] = distance[current] + e.weight;
if (!visited[e.to]) {
visited[e.to] = true;
q.push(e.to);
paths[e.to].clear();
paths[e.to].push_back(current);
}
} else if (distance[e.to] == distance[current] + e.weight) {
paths[e.to].push_back(current);
}
}
}
}

long long totalWeight = 0;
bool visitedPath[MAXN];

void dfs(int node) {
if (visitedPath[node]) return;
visitedPath[node] = true;
for (int prev : paths[node]) {
totalWeight += edges[prev].back().weight;
dfs(prev);
}
}

int main() {
int n, m;
while (scanf("%d %d", &n, &m) != EOF) {
for (int i = 0; i edges[i].clear();
paths[i].clear();
}
for (int i = 0; i int u, v, w;
scanf("%d %d %d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w);
}
spfa(0);
memset(visitedPath, false, sizeof(visitedPath));
totalWeight = 0;
dfs(n - 1);
printf("%lld\n", totalWeight * 2);
}
return 0;
}

上述代码中,我们首先定义了图的结构,包括节点和边。然后实现了SPFA算法来计算最短路径,并记录每个节点的前驱节点。最后,通过深度优先搜索(DFS)遍历所有可能的最短路径,计算它们的总权重。


推荐阅读
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本文详细介绍了Golang中string类型的内部结构及其特性,包括字符串的定义、表示方式、数据结构以及相关的操作方法,如字符串拼接和类型转换等。 ... [详细]
  • 本文详细探讨了如何处理包含多种分隔符的字符串分割问题,并提供了一个高效的C++实现方案。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 本文详细介绍了如何在 EasyUI 框架中实现 DataGrid 组件的分页功能,包括配置方法和常见问题的解决方案。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 本文探讨了在Go语言中处理切片并发修改时如何有效避免竞争条件的方法。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
author-avatar
Happy的紫璐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有