Dijkstra 算法#圖論

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讓圖…