Dijkstra 算法

  • 算法前提:在没有负边的情况下使用。
  • 算法思路:将结点分成已确定最短路长度的点集 S 和未确定最短路长度的点集 T,每次从 T 集合中选取最短路长度最小的结点移到 S 集合中,并对其出边执行更新操作
  1. 从T集合中,选取一个最短路长度最小的结点,移到S集合中。
  2. 对那些刚刚被加入S集合的结点的所有出边执行松弛操作。

 

struct edge { int v, w; // 边的终点和权值
}; 
struct node { int dis, u; // 距离和顶点bool operator > (const node &a ) const {return dis>a.dis; // 优先队列比较函数,小根堆}
}; 
vector<edge> e[MAXN]; // 邻接表存储边
int dis[MAXN], vis[MAXN]; // dis存储最短距离,vis标记是否已确定最短距离
priority_queue<node, vector<node>, greater<node>> q; // 小根堆优先队列void dijkstra(int n, int s) {memset(dis, 0x3f, (n + 1) * sizeof(int)); // 初始化最短距离为无穷大memset(vis, 0, (n + 1) * sizeof(int)); // 初始化标记数组为0dis[s] = 0; // 起点到自身的距离为0q.push({0, s}); // 起点入队while (!q.empty()) {int u = q.top().u; // 取出距离最小的顶点q.pop(); if (vis[u]) continue; // 如果已确定最短距离,跳过vis[u] = 1; // 标记为已确定最短距离for (auto ed : e[u]) { // 遍历u的所有出边int v = ed.v, w = ed.w; // 边的终点和权值// 如果可以通过u得到更短的距离到vif (dis[v] > dis[u] + w) {dis[v] = dis[u] + w; // 更新最短距离q.push({dis[v], v}); // 将v入队}}}
}

 

 

 例题

#i#include <bits/stdc++.h>
using namespace std;const int MAXN = 2010;  // 最大节点数(人数),题目中 n≤2000,这里多开一点防止越界
double dis[MAXN];       // 存储从起点 A 到各节点能保留的金额比例,初始化为极小值
bool vis[MAXN];         // 标记节点是否已确定最长路径,避免重复处理
int n, m, A, B;         // n 是总人数,m 是转账对数,A 是转账起点,B 是转账终点// 边的结构体,用于构建图的邻接表,to 表示转账目标节点,rate 表示转账后能保留的比例(1 - 手续费比例)
struct Edge {int to;double rate;
};vector<Edge> graph[MAXN];  // 邻接表存储图结构,graph[u] 存所有从 u 出发能转账到的节点及对应保留比例// 优先队列中的节点结构体,用于 Dijkstra 算法,node 表示节点编号,val 表示到达该节点时能保留的金额比例
struct Node {int node;double val;// 重载小于运算符,让优先队列按照 val 从大到小排序(大顶堆),这样每次取出当前能保留比例最大的路径bool operator<(const Node& other) const {return val < other.val;}
};// Dijkstra 算法实现,求解从 A 出发到各节点能保留的最大金额比例
void dijkstra() {// 初始化 dis 数组,将起点 A 的保留比例设为 1(还没转账,金额完整保留),其他设为极小值fill(dis, dis + MAXN, 0);dis[A] = 1;// 优先队列,大顶堆,用于每次选当前能保留比例最大的路径拓展priority_queue<Node> pq;pq.push({A, 1});while (!pq.empty()) {Node cur = pq.top();pq.pop();int u = cur.node;double currentRate = cur.val;// 如果当前节点已经处理过(已确定最长路径),跳过if (vis[u]) continue;vis[u] = true;  // 标记为已处理// 遍历当前节点 u 的所有邻接边,尝试更新邻接节点的最大保留比例for (const Edge& e : graph[u]) {int v = e.to;double newRate = currentRate * e.rate;// 如果经过 u 转账到 v 能获得更大的保留比例,就更新,并将 v 加入队列等待处理if (newRate > dis[v]) {dis[v] = newRate;pq.push({v, newRate});}}}
}int main() {// 输入总人数 n 和转账对数 mscanf("%d%d", &n, &m);for (int i = 0; i < m; ++i) {int x, y, z;// 输入转账的两人 x、y 以及手续费比例 zscanf("%d%d%d", &x, &y, &z);double rate = 1 - z / 100.0;  // 计算转账后能保留的比例(1 - 手续费比例)// 因为是互相转账,所以添加两条有向边(x 到 y 和 y 到 x)graph[x].push_back({y, rate});graph[y].push_back({x, rate});}// 输入转账起点 A 和终点 Bscanf("%d%d", &A, &B);dijkstra();  // 执行 Dijkstra 算法,计算从 A 到各节点的最大保留比例// B 要收到 100 元,那么 A 需要的初始金额 = 100 / (A 到 B 能保留的比例)double result = 100 / dis[B];// 输出结果,精确到小数点后 8 位printf("%.8lf\n", result);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89713.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89713.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89713.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源与闭源大模型的生态与技术对比:以百度文心4.5开源为视角

技术对比&#xff1a;开源与闭源大模型的优劣势 性能对比&#xff1a;算力效率与场景适配的博弈 在模型性能的竞技场上&#xff0c;开源与闭源大模型呈现出明显的差异化特征。以百度文心4.5开源系列为例&#xff0c;其47B参数的混合专家&#xff08;MoE&#xff09;模型在飞桨…

企业电商解决方案哪家好?ZKmall模块商城全渠道支持 + 定制化服务更省心

在数字化浪潮席卷各行各业的当下&#xff0c;企业要想拓展市场、提升竞争力&#xff0c;搭建专属电商平台已经成了绕不开的选择。但市场上的电商解决方案五花八门&#xff0c;怎么才能挑到真正适合自己的&#xff1f;其实道理很简单&#xff1a;能同时搞定全渠道支持和定制化服…

使用哪种语言的人更容易通过面试?

Ruby 和 Swift&#xff01;似乎语言越大众面试通过率越低&#xff0c;毕竟岗位数量有限&#xff0c;Java 和 C 程序员所面对的竞争也会更加激烈。使用 Ruby 和 Swift 的程序员比例到底怎么样&#xff1f;我们可以从 Google Trends 中发现一些蛛丝马迹。最火热的 Java 的热度平均…

Axios 二次封装高级教程(含请求取消等功能)

Axios 二次封装高级教程&#xff08;含请求取消等功能&#xff09; 整理不易&#xff0c;收藏、点赞、关注哦&#xff01; 一、总体架构设计 目的&#xff1a;构建一套功能完善、易用且健壮的 HTTP 请求封装层 核心功能&#xff1a; 请求拦截、响应拦截请求取消&#xff08;防…

MobileNet V1的Pytorch实现并加载预训练模型进行验证

一. 环境 windonws 11RTX5060CUDA 12.8Pytorch 2.9.0dev20250630cu128torchvision 0.23.0dev20250701cu128 二. 代码 基于Mobilenet-CustomData 的Mobilenet_Pretrain.ipynb 1. 定义Mobile Net V1 import os import time import torch import torch.nn as nn import torch…

HTTP协议利用TCP的特性来实现长连接

在讨论网络协议时,经常会有人提出这样一个问题:“既然HTTP是基于TCP的,而TCP本身支持长连接,为什么HTTP不支持长连接?”这种说法其实是一种误解。实际上,HTTP确实可以并且经常使用长连接(也称为持久连接)。 什么是长连接? 首先,我们需要明确什么是“长连接”。在网…

整流电路Multisim电路仿真实验汇总——硬件工程师笔记

目录 1 整流电路基础 1.1 整流电路基本原理 1.2 整流电路的类型 1.2.1 单相整流电路 1.2.2 三相整流电路 1.3 整流电路的应用 1.3.1 直流电源 1.3.2 电池充电器 1.3.3 变频调速系统 1.34 电解和电镀 1.4 整流电路的优缺点 1.4.1 优点 1.4.2 缺点 2 二极管整流电路…

LangChain 全面入门

什么是 LangChain&#xff1f; LangChain 是一个专门为 大语言模型 (LLM) 应用开发设计的开源框架&#xff0c;帮你快速实现&#xff1a; • 多轮对话 • 知识库问答 (RAG) • 多工具协同调用 (function calling / tool) • 智能体 Agent 自动决策任务链 解耦 LLM 接口、Prom…

RabbitMQ 高级特性之消息确认

1. 简介 RabbitMQ 的消息发送流程&#xff1a; producer 将消息发送给 broker&#xff0c;consumer 从 broker 中获取消息并消费 那么在这里就涉及到了两种消息发送&#xff0c;即 producer 与 broker 之间和 consumer 与 broker 之间。 “消息确认” 讨论的是 consumer 与…

【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14

缘由 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断计时 秒 分 时 毫秒 sbit k0P3^0; sbit k1P3^1; void smxs(u…

Android15 开机动画播放结束之后如何直接启动应用

问题背景 软件版本:Android15 在一些需求场景里面,需要开机动画播放结束立马去启动一个应用,下面介绍如何实现这种方案。 解决方案 首选我们需要知道开机动画播放结束之后的流程,这里会调用到wms里面,也就是一些enableScreen之类的函数,知道这个大概流程之后,再去对应…

AI实践:大模型痛点和解决方案讨论

大家好&#xff0c;我是星野&#xff0c;欢迎来到我的CSDN博客。在这个技术日新月异的时代&#xff0c;我们一起学习&#xff0c;共同进步。 今天想和大家分享的是大模型在实际应用中的痛点以及解决方案&#xff0c;特别是RAG&#xff08;检索增强生成&#xff09;技术。 大模…

Web前端工程化

Web前端工程化 前端工程化是指将软件工程的方法和原则应用到前端开发中&#xff0c;以提高开发效率、保证代码质量、便于团队协作和项目维护的一套体系化实践。以下是前端工程化的主要内容和实践&#xff1a; 核心组成部分 1. 模块化开发 JavaScript模块化&#xff1a;Comm…

Java 原生 HTTP Client

​介绍 Java 原生 HttpClient 是从 Java 11 开始引入的标准库&#xff0c;用于简化 HTTP 请求的发送与响应处理。它支持同步和异步请求&#xff0c;并内置对 HTTP/1.1 和 HTTP/2 协议的支持。HttpClient 提供了易用的 API 来设置请求头、请求体、处理响应以及配置 SSL/TLS 加密…

【C语言刷题】第十天:加量加餐继续,代码题训练,融会贯通IO模式

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

【WEB】Polar靶场 6-10题 详细笔记

六.jwt 这题我又不会写 先来了解下jwt **JWT&#xff08;JSON Web Token&#xff09;**是一种基于JSON的开放标准&#xff08;RFC 7519&#xff09;&#xff0c;主要用于在网络应用环境间传递声明信息。JWT通常用于身份验证和信息交换&#xff0c;确保在各方之间安全地传输信…

高阶亚马逊运营秘籍:关键词矩阵打法深度解析与应用

当竞争对手还在为单个大词竞价厮杀时&#xff0c;头部卖家已悄然构建了一张覆盖数千长尾关键词的隐形网络&#xff0c;精准触达每一个细分需求&#xff0c;以更低的成本撬动更高的转化率在亚马逊流量红利消退、广告成本高企的2025年&#xff0c;传统“爆款关键词”打法已显疲态…

【问题解决】org.springframework.web.util.NestedServletException Handler dispatch failed;

详细异常信息&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at org.springframework.web.servlet.DispatcherServlet.doDispatch(Disp…

【已解决】mac 聚焦搜索设置了edge 的地址栏搜索为google,还是跳转到百度

问题详情&#xff1a;在macbook的聚焦搜索中点击edge搜索的时候&#xff0c;跳转到了百度&#xff0c;即使已经将地址栏的搜索引擎设置为了goole&#xff0c;但是还是会跳转到百度。解决方案&#xff1a;1、打开safari浏览器。&#xff08;看清了&#xff0c;是打开Safari&…

MimicMotion 让你的图片动起来

MimicMotion 是由腾讯公司推出的一款人工智能人像动态视频生成框架。可以模仿视频动作再让图片模仿动作姿态&#xff0c;最后生成视频。 MimicMotion 的核心在于其置信度感知的姿态引导技术&#xff0c;确保视频帧的高质量和时间上的平滑过渡。 以前咱们也手搭过Animate-X让图…