算法競賽備賽——【圖論】求最短路徑——Dijkstra

Dijkstra

用來計算從一個點到其他所有點的最短路徑的算法,是一種單源最短路徑算法。也就是說,只能計算起點只有一個的情況。Dijkstra的時間復雜度是O (|v|^2),它不能處理存在負邊權的情況。

鄰接矩陣存圖

#include<iostream>
using namespace std;//最短路徑——Djikstra算法
// 求單元最短路
// 時間復雜度:O(n^2)
//求最短路徑:BFS、Floyd(基于dp)、Djikstra算法//以 鄰接矩陣 存 帶權無向圖 為例#define INF 68888int g[105][105];
int dist[105];//記錄最短路的大小
int path[105];//記錄最短路的順序
int flag[105];//flag[i]=1 i的最短路已確定  =0未確定
int n, m;
int s;//起點void Djikstra(int s) {//起點到起點flag[s] = 1;dist[s] = 0;path[s] = s;//其他點到起點int minn = INF;//最小的dist的值int t=0;//最小的dist的下標for (int i = 1; i < n; i++) {//循環n-1次minn = INF;for (int j = 0; j < n; j++) {if (flag[j] == 0 && dist[j] < minn) {minn = dist[j];t = j;}}//t點時dist值最小的點flag[t] = 1;//變為已確定最短路徑的點//t去中轉t的鄰接點 修改distfor (int j = 0; j < n; j++) {if (flag[j] == 0 && dist[j] > (dist[t] + g[t][j])) {dist[j] = dist[t] + g[t][j];path[j] = t;}}}
}int main() {cin >> n >> m;//初始化for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j) {g[i][j] = 0;}else {g[i][j] = INF;}}}int x, y, w;for (int i = 1; i <= m; i++) {cin >> x >> y >> w;g[x][y] = g[y][x] = w;}cin >> s;//初始化for (int i = 0; i < n; i++) {dist[i] = g[s][i];if (g[s][i] == INF) {path[i] = -1;}else {path[i] = s;}}Djikstra(s);//輸出驗證for (int i = 0; i < n; i++) {cout << "s到" << i << "的最短路徑長度是" << dist[i] <<":";//倒敘輸出路徑cout << i << " ";int j = i;while (path[j] != j) {cout << path[j] << " ";j = path[j];}cout << endl;}return 0;
}

鏈式前向星版本

#include<bits/stdc++.h>
using namespace std;
#define inf 1001 //鏈式前向星寫Dijkstra 
int n,m,cnt; //n<100 0<權值<1000
int h[105];
struct Edge{int to,w,next;
}e[10005]; //100個點 最多100*(100-1)條邊 
int dis[105],v[105]; void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u]; h[u]=cnt;cnt++;
}void dij(int x){for(int i=1;i<=n;++i) {dis[i]=inf;}dis[x]=0;int u; for(int j=1;j<=n;++j){int minn=inf,k=-1;for(int i=1;i<=n;++i){if(v[i]==0&&dis[i]<minn){minn=dis[i];k=i;}	} v[k]=1;for(int i=h[k];i!=-1;i=e[i].next){u=e[i].to;if(v[u]==0&&dis[u]>dis[k]+e[i].w){dis[u]=dis[k]+e[i].w; }}}
}int main(){memset(h,-1,sizeof h);cin>>n>>m;int x,y,w; for(int i=1;i<=m;++i){cin>>x>>y>>w;//有向圖add(x,y,w); } cin>>x;dij(x);for(int i=1;i<=n;++i){cout<<dis[i]<<" ";}return 0;
} 

優化版本:堆 找最小的點 ------> 優先隊列

#include<bits/stdc++.h>
using namespace std;
#define inf 1001 //鏈式前向星寫Dijkstra 
int n,m,cnt; //n<100 0<權值<1000
int h[105];
struct Edge{int to,w,next;
}e[10005]; //100個點 最多100*(100-1)條邊 
int dis[105],v[105]; 
typedef pair<int,int> PII; 
priority_queue<PII,vector<PII>,greater<PII>> q; void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u]; h[u]=cnt;cnt++;
}void dij(int x){//堆優化 for(int i=1;i<=n;++i) {dis[i]=inf;}dis[x]=0;PII now;now.first=dis[x];now.second=x;q.push(now);while(q.size()){now=q.top();q.pop();int minn=now.first;int k=now.second;if(v[k]==1) continue;//避免重復入隊的點v[k]=1;for(int i=h[k];i!=-1;i=e[i].next){int u=e[i].to;if(dis[u]>minn+e[i].w){dis[u]=minn+e[i].w;now.first=dis[u];now.second=u;q.push(now); }}}
}int main(){memset(h,-1,sizeof h);cin>>n>>m;int x,y,w; for(int i=1;i<=m;++i){cin>>x>>y>>w;//有向圖add(x,y,w); } cin>>x;dij(x);for(int i=1;i<=n;++i){cout<<dis[i]<<" ";}return 0;
} 

例題

1

P4779 【模板】單源最短路徑(標準版) - 洛谷

#include<bits/stdc++.h>
using namespace std;
#define inf 1e9 
using ll=long long ;//鏈式前向星寫Dijkstra 
int n,m,cnt; //n<100 0<權值<1000
int h[100005];
struct Edge{int to,w,next;
}e[200005]; //100個點 最多100*(100-1)條邊 
ll dis[100005];
int v[100005]; 
typedef pair<int,int> PII; 
priority_queue<PII,vector<PII>,greater<PII>> q; void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u]; h[u]=cnt;cnt++;
}void dij(int x){//堆優化 for(int i=1;i<=n;++i) {dis[i]=inf;}dis[x]=0;PII now;now.first=dis[x];now.second=x;q.push(now);while(q.size()){now=q.top();q.pop();int minn=now.first;int k=now.second;if(v[k]==1) continue;v[k]=1;for(int i=h[k];i!=-1;i=e[i].next){int u=e[i].to;if(dis[u]>minn+e[i].w){dis[u]=minn+e[i].w;now.first=dis[u];now.second=u;q.push(now); }}}
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);memset(h,-1,sizeof h);int s;//scanf("%d %d %d",&n,&m,&s);cin>>n>>m>>s; int x,y,w; for(int i=1;i<=m;++i){//scanf("%d %d %d",&x,&y,&w);cin>>x>>y>>w;add(x,y,w); } dij(s);for(int i=1;i<=n;++i){//printf("%d ",dis[i]);cout<<dis[i]<<" ";}return 0;
} 

2

[P8802 藍橋杯 2022 國 B] 出差 - 洛谷

#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
int n,m,cnt;
int h[1005],c[1005];
int flag[1005];//標記數組 
struct Edge{int to,w,next;
}e[20005];//無向圖開兩倍空間
int dis[1005]; 
typedef pair<int,int> PII;
priority_queue<PII,vector<PII>,greater<PII>> q;
void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u];h[u]=cnt;cnt++;
}void dij(int s){dis[s]=0;PII now,next;int u,v,w;now.first=dis[s];now.second=s;q.push(now);while(!q.empty()){now=q.top();q.pop();u=now.second;if(flag[u]==1) continue;flag[u]=1;for(int i=h[u];i!=-1;i=e[i].next){v=e[i].to;w=e[i].w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;next.first=dis[v];next.second=v;q.push(next);}}} 
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m;memset(h,-1,sizeof h); memset(dis,0x3f,sizeof dis);//dis[i]=0x3f3f3f3f按字節賦值 for(int i=1;i<=n;++i){cin>>c[i];}int u,v,w;for(int i=1;i<=m;++i){cin>>u>>v>>w;add(u,v,w+c[v]);//u---->v   點權加入邊權里 add(v,u,w+c[u]);//v---->u}dij(1);cout<<dis[n]-c[n]<<endl; //最后減去終點點權 return 0;
} 

3

P1462 通往奧格瑞瑪的道路 - 洛谷

#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
int n,m,b,cnt=0;
int h[10005],f[10005];
int flag[10005];//標記數組 
struct Edge{int to,w,next;
}e[100005];//無向圖開兩倍空間
int dis[10005]; 
typedef pair<int,int> PII;
priority_queue<PII,vector<PII>,greater<PII>> q;
void add(int u,int v,int w){e[cnt].to=v;e[cnt].w=w;e[cnt].next=h[u];h[u]=cnt;cnt++;
}bool dij(int s,int maxx){if(maxx<f[s]) return false; memset(dis,0x3f,sizeof dis);memset(flag,0,sizeof flag);PII now,next;int u,v,w;dis[s]=0;now.first=dis[s];now.second=s;q.push(now);while(!q.empty()){now=q.top();q.pop();u=now.second;if(flag[u]==1) continue;flag[u]=1;for(int i=h[u];i!=-1;i=e[i].next){v=e[i].to;w=e[i].w;if(f[v]<=maxx&&dis[v]>dis[u]+w){dis[v]=dis[u]+w;next.first=dis[v];next.second=v;q.push(next);}}} return dis[n]<=b;
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m>>b;memset(h,-1,sizeof h); int l=0x3f3f3f3f,r=-0x3f3f3f3f; for(int i=1;i<=n;++i){cin>>f[i];r=max(r,f[i]);l=min(l,f[i]);}int u,v,w;for(int i=1;i<=m;++i){cin>>u>>v>>w;if(u==v) continue;//有自環 add(u,v,w);add(v,u,w);}if(dij(1,0x3f3f3f3f)==0){cout<<"AFK"<<endl;return 0;}//二分求答案int mid=0,ans=0;while(l<=r){mid=(l+r)/2;if(dij(1,mid)){ans=mid;r=mid-1;}else{l=mid+1;}} cout<<ans<<endl;return 0;
} 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89944.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

影刀 RPA:批量修改 Word 文檔格式,高效便捷省時省力

在日常辦公和文檔處理中&#xff0c;Word 文檔格式的統一和規范是許多企業和個人用戶的重要需求。無論是撰寫報告、制作提案&#xff0c;還是整理資料&#xff0c;都需要確保文檔格式的一致性。然而&#xff0c;手動修改多個 Word 文檔的格式不僅耗時費力&#xff0c;還容易因疏…

GitLab 社區版 10.8.4 安裝、漢化與使用教程

一、GitLab 安裝 GitLab 提供了集成所需軟件的 RPM 包&#xff0c;簡化了安裝流程。我們選擇安裝社區版&#xff08;CE&#xff09;10.8.4&#xff0c;可通過官方網站或國內鏡像源&#xff08;如清華鏡像&#xff09;獲取安裝包。 1. 準備工作 首先創建工具目錄并進入&#…

[硬件電路-64]:模擬器件 -二極管在穩壓電路中的應用

二極管在穩壓電路中的應用主要基于其單向導電性和特定類型二極管&#xff08;如穩壓二極管&#xff09;的電壓穩定特性。以下是詳細解釋&#xff1a;一、普通二極管的穩壓作用&#xff08;有限場景&#xff09;正向導通壓降的利用&#xff1a;原理&#xff1a;普通二極管在正向…

【Linux】重生之從零開始學習運維之Nginx

安裝apt/yum安裝apt imstall nginx yum install nginxRocky源碼編譯安裝基礎編譯環境yum install gcc make gcc-c glibc glibc-devel pcre pcre-devel openssl openssldevel systemd-devel zlib-devel yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-deve…

主流 MQ 的關鍵性能指標

常用消息隊列&#xff08;MQ&#xff09;的“數量級”通常圍繞吞吐量&#xff08;TPS&#xff0c;每秒處理消息數&#xff09;、消息堆積能力、延遲三個核心指標展開&#xff0c;不同MQ因設計目標&#xff08;高吞吐、低延遲、高可靠等&#xff09;不同&#xff0c;數量級差異顯…

[NIPST AI]對抗性機器學習攻擊和緩解的分類和術語

原文link&#xff1a;https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2025.pdf Introduction 人工智能&#xff08;AI&#xff09;系統在過去幾年中持續全球擴展。這些系統正在被眾多國家開發并廣泛部署于各自的經濟體系中&#xff0c;人們在生活的許多領域都獲得了更多使…

[深度學習] 大模型學習3上-模型訓練與微調

在文章大語言模型基礎知識里&#xff0c;模型訓練與微調作為大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;應用構建的主要方式被簡要提及&#xff0c;本系列文章將從技術原理、實施流程及應用場景等維度展開深度解析。相關知識的進一步參考見&#x…

Claude Code 啟動提示 Note: Claude Code might not be available in your country. 解決

如下圖所示 主播參考了在別的地方看來的解決方案&#xff08;并非主播不想標注來源&#xff0c;主要是忘記是哪里看來的了&#xff0c;下班就忘記了&#xff0c;懶得找了&#x1f62d;&#xff0c;如果后續找到會補上的&#xff09;。 好了&#xff0c;開始正文&#xff0c;開始…

Unity VR多人手術系統恢復3:Agora語音通訊系統問題解決全記錄

&#x1f3af; 前言 這是一個Unity多人VR手術模擬項目&#xff0c;已經擱置了近兩年時間。最近重新啟動了這個項目&#xff0c;然而在恢復過程中卻遇到了些的技術障礙。 項目重啟遇到的挑戰 當我們重新部署和測試系統時&#xff0c;發現原本運行良好的Agora語音通訊功能完全…

sqli-labs靶場通關筆記:第46-53關 order by注入

目錄 第46關 order by注入 第47關 閉合的order by注入 第48關 無報錯回顯的數字型order by注入 第49關 無報錯回顯的閉合型order by注入 第50關 基于order by的堆疊注入 第51關 閉合的報錯注入或堆疊注入 第52關 數字型盲注或堆疊注入 第53關 閉合的盲注或堆疊注入 第…

cdh6.3.2的hive使用apache paimon格式只能創建不能寫報錯的問題

前言根據官網paimon安裝教程&#xff0c;看上去簡單&#xff0c;實則報錯阻礙使用的信心。 解決方法原帶的jars下的zstd開頭的包舊了&#xff0c;重新下載zstd較新的包單獨放到每個節點的hive/lib下;然后將hdfs yarn用戶下的mr-framework.tar.gz中的zstdjar包替換成新的版本。重…

【Vue進階學習筆記】實現圖片懶加載

創建Vue項目 首先確保你已安裝Vue CLI&#xff0c;然后創建一個新的Vue 3項目&#xff1a; npm init vuelatest安裝依賴 安裝vueuse/core庫&#xff0c;它提供了useIntersectionObserver組合式API&#xff1a; cnpm install cnpm install vueuse/core創建指令文件夾和文件 在sr…

深入理解 synchronized

深入理解 synchronized 引言&#xff1a;synchronized的核心地位 在Java并發編程中&#xff0c;synchronized關鍵字是實現線程安全的基石。自JDK 1.0引入以來&#xff0c;它經歷了從"重量級鎖"到"自適應鎖"的進化&#xff0c;如今已成為兼顧安全性與性能的…

C語言字符串相關函數

C語言筆記內容提要數組字符串基本操作字符串相關函數綜合案例&#xff1a;學生成績管理系統數組字符串基本操作在用格式化說明符%s進行輸入輸出時&#xff0c;其輸入輸出項均為數組名。但在輸入時&#xff0c;相鄰兩個字符串之間要用空格分隔&#xff0c;系統將自動在字符串后加…

從零開始:用Python庫輕松搭建智能AI代理

為什么要關注AI代理&#xff1f; “Agentic AI”&#xff08;智能代理&#xff09;正在悄然改變我們的工作方式。想象一下&#xff0c;一個AI助手不僅能幫你查航班、訂機票&#xff0c;還能自動安排行程、發郵件、生成日報——就像一個效率極高的“虛擬助理”團隊。 對于測試工…

如何防止GitHub上的敏感信息被泄漏?

如大家所了解的&#xff0c;隨著GitHub的用戶越來越多&#xff0c;GitHub上的敏感信息被泄漏的問題也越來越嚴重。那么如何做&#xff0c;才能防止此類事情發生呢&#xff1f;這值得我們探討。移除并刪除敏感信息當我們發現了歷史 commit 中包含敏感信息后&#xff0c;第一步便…

船舶機械零件的深孔工藝及檢測方法 —— 激光頻率梳 3D 輪廓檢測

引言船舶機械零件中的深孔結構&#xff08;深徑比&#xff1e;15:1&#xff09;直接影響動力系統可靠性&#xff0c;如柴油機缸體深孔、推進軸系潤滑油孔等。此類深孔具有孔徑大&#xff08;φ10 - 50mm&#xff09;、深度深&#xff08;500 - 2000mm&#xff09;、表面質量要求…

論文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping

基本信息 題目&#xff1a;Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping 來源&#xff1a;ICCV 2025 學校&#xff1a;Sapienza University of Rome 是否開源&#xff1a;https://github.com/rvp-group/Splat-LOAM 摘要&#xff1a;純激光3DGS&#xff01;…

MYSQL:數據庫約束

文章目錄MYSQL&#xff1a;數據庫約束&#xff1a;為你的數據上把“安全鎖”1. 約束的類型概覽2. NOT NULL 非空約束3. DEFAULT 默認值約束4. UNIQUE 唯一約束5. PRIMARY KEY 主鍵約束5.1 自增主鍵 AUTO_INCREMENT5.3 復合主鍵6. FOREIGN KEY 外鍵約束7. CHECK 約束總結MYSQL&a…

網絡數據編碼技術及其應用場景的全面解析

網絡數據編碼技術全景圖?編碼類型??編碼原理??適用層??典型應用場景??優勢??缺陷??曼徹斯特編碼?電平跳變代表數據位&#xff08;高→低1&#xff0c;低→高0&#xff09;物理層10/100M以太網、RFID標簽自同步時鐘帶寬利用率僅50%?4B/5B編碼?4比特映射為5比特物…