搜索與圖論復習2最短路

單源最短路---所有邊權是正數(Dijkstra算法O(n^2)--稠密圖(鄰接矩陣)和堆優化的Dijkstra算法O(mlogn)--稀疏圖(鄰接表))?或存在負邊權(Bellman-ford貝爾曼福特算法O(nm)和SPFA一般O(m) 最壞O(nm)? )

多源最短路---Floyd算法O(n^3)

一、迪杰斯特拉算法(Dijkstra):1dist[1]=0,dist[v]=正無窮。2for(v的0~n),s是當前已經確定最短路徑的點,t是不在s中的距離最近的點,t放進s中,用t更新其他點的距離(dist[x]>dist[t]+w)更新。通過鄰接矩陣存圖。

#include<iostream>
#include<cstring> 
using namespace std;
const int N=510;
int n,m;
int g[N][N];
int dist[N];
bool st[N];//確定最短路 
int dijkstra(){memset(dist,0x3f,sizeof(dist));dist[1]=0;//起點 for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++){if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;//找到dist最小的點 }if(t==n)break;//優化 st[t]=true;for(int j=1;j<=n;j++){dist[j]=min(dist[j],dist[t]+g[t][j]);}}if(dist[n]==0x3f3f3f3f)return -1;else return dist[n];
}
int main(){cin>>n>>m;memset(g,0x3f,sizeof(g));while(m--){int a,b,c;cin>>a>>b>>c;g[a][b]=min(g[a][b],c);}int t=dijkstra();cout<<t<<endl;return 0;
}

二、堆優化的迪杰斯特拉算法:優化在n個數中找距離最近的點O(n^2)用堆優化

#include<iostream>
#include<cstring> 
#include<queue> 
using namespace std;
typedef pair<int,int>PII;
const int N=150010;
int n,m;
int h[N],e[N],ne[N],idx,w[N];//權重 
int dist[N];
bool st[N];//是否已經確定最短路 
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int dijkstra(){memset(dist,0x3f,sizeof(dist));dist[1]=0;//起點 priority_queue<PII,vector<PII>,greater<PII>>heap;heap.push({0,1});//從1點開始,0為距離 while(heap.size()){auto t=heap.top();heap.pop();int ver=t.second,distance=t.first;if(st[ver])continue;st[ver]=true; for(int i=h[ver];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>distance+w[i]){dist[j]=distance+w[i];heap.push({dist[j],j}); }}}if(dist[n]==0x3f3f3f3f)return -1;else return dist[n];
}
int main(){cin>>n>>m;memset(h,-1,sizeof(h));while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);}int t=dijkstra();cout<<t<<endl;return 0;
}

三、Bellman-Ford算法for循環n次,(備份)for所有邊a,b,w表示所有a到b的邊權值為w,(松弛),處理有福權邊,能判斷是否有負環(但是一般用SPFA做)

    • 第?k?次松弛:找到經過最多?k?條邊的最短路徑。

  • 通過多次松弛,算法可以逐步覆蓋從起點到所有節點的所有可能路徑

#include<iostream>
#include<cstring>
using namespace std;
const int N=510,M=10010;
int n,m,k;
int dist[N],backup[N];
struct Edge{int a,b,w;
}edges[M];
int bellman_ford(){memset(dist,0x3f,sizeof(dist));dist[1]=0;for(int i=0;i<k;i++){memcpy(backup,dist,sizeof(dist));for(int j=0;j<m;j++){int a=edges[j].a,b=edges[j].b,w=edges[j].w;dist[b]=min(dist[b],backup[a]+w);}}if(dist[n]>0x3f3f3f3f/2)return -0x3f3f3f3f;else return dist[n];
}
int main(){cin>>n>>m>>k;for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;edges[i]={a,b,c};}int t=bellman_ford();if(t==-0x3f3f3f3f)cout<<"impossible"<<endl;else cout<<t<<endl;return 0;
}

四、SPFA算法:用隊列,只要有變小就取出隊頭,更新t的所有出邊,成功就加入隊列(更新過誰就拿誰來操作)通過隊列優化 Bellman-Ford 算法,只對距離發生變化的節點進行松弛操作。

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
const int N=100010;
int dist[N];
bool st[N];
int h[N],e[N],ne[N],idx,w[N];
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int spfa(){memset(dist,0x3f,sizeof(dist));dist[1]=0;queue<int>q;q.push(1);st[1]=true;while(q.size()){int t=q.front();q.pop();st[t]=false;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]){dist[j]=dist[t]+w[i];if(!st[j]){q.push(j);st[j]=true;}}}}if(dist[n]==0x3f3f3f3f)return -0x3f3f3f3f;return dist[n];
}
int main(){cin>>n>>m;memset(h,-1,sizeof(h));while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);}int t=spfa();if(t==-0x3f3f3f3f)cout<<"impossible"<<endl;else cout<<t<<endl;return 0;
}

補充負環判斷:維護cnt[x]=cnt[t]+1,的數組,如果cnt[x]>=n存在負環。

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=2010,M=10010;
int h[N],e[M],ne[M],idx,w[M];
int dist[N],cnt[N];
bool st[N];
int n,m;
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int spfa(){queue<int>q;for(int i=1;i<=n;i++){q.push(i);st[i]=true;}while(q.size()){int t=q.front();q.pop();st[t]=false;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]){dist[j]=dist[t]+w[i];cnt[j]=cnt[t]+1;if(cnt[j]>=n)return true;if(!st[j]){q.push(j);st[j]=true;}}}}return false;
}
int main(){cin.tie(0),cout.tie(0);ios::sync_with_stdio(false);cin>>n>>m;memset(h,-1,sizeof(h));while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);}if(spfa())cout<<"Yes"<<endl;else cout<<"No"<<endl;return 0;
}

五、Floyd算法:基于動態規劃三層for枚舉d(i,j)=min(d(i,j),d(i,k)+d(k,j))。

#include<iostream>
#include<cstring> 
using namespace std;
const int N=210,INF=1e9;
int n,m,Q;
int d[N][N];
void floyd(){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){d[i][j]=min(d[i][j],d[i][k]+d[k][j]);}}}
}
int main(){cin>>n>>m>>Q;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j)d[i][j]=0;else d[i][j]=INF;}}while(m--){int a,b,w;cin>>a>>b>>w;d[a][b]=min(d[a][b],w);}floyd();while(Q--){int a,b;cin>>a>>b;if(d[a][b]>INF/2)cout<<"impossible"<<endl;else cout<<d[a][b]<<endl;}return 0;
}

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

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

相關文章

Unity GetLocalizedString()失效問題

問題&#xff1a; 在一個自定義類中調用GetLocalizedString()的方法&#xff0c;是無效的&#xff08;創建這個自定義類的腳本沒掛載到場景中&#xff09;。 解決方法: 將自定義類的GetLocalizedString()方法換個地方&#xff0c;換到在場景中掛載的一個腳本實例&#xff08;…

【建站】專欄目錄

建站專欄的想法有很多&#xff0c;想寫窮鬼如何快速低成本部署前后端項目讓用戶能訪問到&#xff0c;如何將網站收錄到百度&#xff0c;bing&#xff0c;google并優化seo讓搜索引擎搜索到網站&#xff0c;想寫如何把網站加入google廣告或者接入stripe信用卡首款平臺收款&#x…

深入解析“legit”的地道用法——從俚語到正式表達:Sam Altman用來形容DeepSeek: legit invigorating(真的令人振奮)

深入解析“legit”的地道用法——從俚語到正式表達 一、引言 在社交媒體、科技圈甚至日常對話中&#xff0c;我們經常會看到或聽到“legit”這個詞。比如最近 Sam Altman 在 X&#xff08;原 Twitter&#xff09;上發的一條帖子中寫道&#xff1a; we will obviously deliver …

Vue 圖片引用方式詳解:靜態資源與動態路徑訪問

目錄 前言1. 引用 public/ 目錄2. assets/ 目錄3. 遠程服務器4. Vue Router 動態訪問5. 總結6. 擴展&#xff08;圖片不顯示&#xff09; 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 在 Vue 開發中&#x…

DeepSeek-R1 本地部署教程(超簡版)

文章目錄 一、DeepSeek相關網站二、DeepSeek-R1硬件要求三、本地部署DeepSeek-R11. 安裝Ollama1.1 Windows1.2 Linux1.3 macOS 2. 下載和運行DeepSeek模型3. 列出本地已下載的模型 四、Ollama命令大全五、常見問題解決附&#xff1a;DeepSeek模型資源 一、DeepSeek相關網站 官…

JVM運行時數據區域-附面試題

Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。這些區域 有各自的用途&#xff0c;以及創建和銷毀的時間&#xff0c;有的區域隨著虛擬機進程的啟動而一直存在&#xff0c;有些區域則是 依賴用戶線程的啟動和結束而建立和銷毀。 1. 程序計…

什么是LPU?會打破全球算力市場格局嗎?

在生成式AI向垂直領域縱深發展的關鍵節點&#xff0c;一場靜默的芯片革命正在改寫算力規則。Groq研發的LPU&#xff08;Language Processing Unit&#xff09;憑借其顛覆性架構&#xff0c;不僅突破了傳統GPU的性能天花板&#xff0c;更通過與DeepSeek等國產大模型的深度協同&a…

如何構建ObjC語言編譯環境?構建無比簡潔的clang編譯ObjC環境?Windows搭建Swift語言編譯環境?

如何構建ObjC語言編譯環境? 除了在線ObjC編譯器&#xff0c;本地環境Windows/Mac/Linux均可以搭建ObjC編譯環境。 Mac自然不用多說&#xff0c;ObjC是親兒子。(WSL Ubuntu 22.04) Ubuntu可以安裝gobjc/gnustep和gnustep-devel構建編譯環境。 sudo apt-get install gobjc gnus…

2月3日星期一今日早報簡報微語報早讀

2月3日星期一&#xff0c;農歷正月初六&#xff0c;早報#微語早讀。 1、多個景區發布公告&#xff1a;售票數量已達上限&#xff0c;請游客合理安排行程&#xff1b; 2、2025春節檔總票房破70億&#xff0c;《哪吒之魔童鬧海》破31億&#xff1b; 3、美宣布對中國商品加征10…

DeepSeek 原理解析:與主流大模型的差異及低算力優勢

在人工智能大模型蓬勃發展的浪潮中&#xff0c;DeepSeek 以其獨特的技術路線和出色的性能表現脫穎而出。與主流大模型相比&#xff0c;DeepSeek 不僅在技術原理上有著顯著的差異&#xff0c;還展現出了在較低算力下達到 OpenAI API 水平的卓越能力。本文將深入剖析這些獨特之處…

C++ Primer 標準庫vector

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

【Numpy核心編程攻略:Python數據處理、分析詳解與科學計算】2.6 廣播機制核心算法:維度擴展的數學建模

2.6 廣播機制核心算法&#xff1a;維度擴展的數學建模 目錄/提綱 #mermaid-svg-IfELXmhcsdH1tW69 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IfELXmhcsdH1tW69 .error-icon{fill:#552222;}#mermaid-svg-IfELXm…

【Elasticsearch】硬件資源優化

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

bootstrap.yml文件未自動加載問題解決方案

在添加bootstrap.yml文件后,程序未自動掃描到,即圖標是這樣的: 查了一些資料,是缺少bootstrap相關依賴,雖然已經添加了spring-cloud-context依賴,但是這個依賴并未引入bootstrap依賴,可能是版本問題,需要手動引入 <dependency><groupId>org.springframework.cloud&…

C++底層學習預備:模板初階

文章目錄 1.編程范式2.函數模板2.1 函數模板概念2.2 函數模板原理2.3 函數模板實例化2.3.1 隱式實例化2.3.2 顯式實例化 2.4 模板參數的匹配原則 3.類模板希望讀者們多多三連支持小編會繼續更新你們的鼓勵就是我前進的動力&#xff01; 進入STL庫學習之前我們要先了解有關模板的…

【玩轉 Postman 接口測試與開發2_015】第12章:模擬服務器(Mock servers)在 Postman 中的創建與用法(含完整實測效果圖)

《API Testing and Development with Postman》最新第二版封面 文章目錄 第十二章 模擬服務器&#xff08;Mock servers&#xff09;在 Postman 中的創建與用法1 模擬服務器的概念2 模擬服務器的創建2.1 開啟側邊欄2.2 模擬服務器的兩種創建方式2.3 私有模擬器的 API 秘鑰的用法…

【算法】回溯算法專題③ ——排列型回溯 python

目錄 前置小試牛刀回歸經典舉一反三總結 前置 【算法】回溯算法專題① ——子集型回溯 python 【算法】回溯算法專題② ——組合型回溯 剪枝 python 小試牛刀 全排列 https://leetcode.cn/problems/permutations/description/ 給定一個不含重復數字的數組 nums &#xff0c;返…

8.原型模式(Prototype)

動機 在軟件系統中&#xff0c;經常面臨著某些結構復雜的對象的創建工作&#xff1b;由于需求的變化&#xff0c;這些對象經常面臨著劇烈的變化&#xff0c;但是它們卻擁有比較穩定一致的接口。 之前的工廠方法和抽象工廠將抽象基類和具體的實現分開。原型模式也差不多&#…

LabVIEW如何高頻采集溫度數據?

在LabVIEW中進行高頻溫度數據采集時&#xff0c;選擇合適的傳感器&#xff08;如熱電偶或熱電阻&#xff09;和采集硬件是關鍵。下面是一些建議&#xff0c;幫助實現高效的溫度數據采集&#xff1a; 1. 傳感器選擇&#xff1a; 熱電偶&#xff08;Thermocouple&#xff09;&am…

Kotlin 委托詳解

Kotlin 委托詳解 引言 Kotlin 作為一種現代化的編程語言&#xff0c;在 Android 開發等領域得到了廣泛的應用。在 Kotlin 中&#xff0c;委托&#xff08;Delegation&#xff09;是一種強大的特性&#xff0c;它可以讓我們以更簡潔的方式實現代碼的復用和擴展。本文將詳細解析…