Acwing--朴素dijkstra
生活随笔
收集整理的這篇文章主要介紹了
Acwing--朴素dijkstra
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
#include <iostream>
#include <cstring>
using namespace std;/*
優點:可以求得【n】到任一點的最短距離;可以輸入最短路徑(經過的點)
缺點:略麻煩
*/const int N=510;//點數
int g[N][N];//稠密圖,使用鄰接矩陣
int dist[N];//n點到【s】的距離
int path[N];//存儲路徑
bool collect[N];//用來判斷是否還在集合中int n,m;//找未收錄集合中最小的dist
int findmin(){int v,min_v;int min_dist=0x3f3f3f3f;//未被錄入且dist[]最小for(v=1;v<=n;v++){if(!collect[v]&&dist[v]<min_dist){min_dist=dist[v];//更新最小距離min_v=v;//更新最小點}}if(min_dist<0x3f3f3f3f){ //沒有找到,min_dist就沒有更新成功return min_v;}else{return -1;}
}//傳入s點即可,【s】~~【n】的距離
void dijkstra(int s){//先把起點收集進去dist[s]=0;collect[s]=true;//再把與s的鄰接點初始化一下 //一共n個點,每個遍歷找鄰接點for(int i=1;i<=n;i++){if(g[s][i]!=0x3f3f3f3f){ //如果s-->i邊的權重(距離)不是正無窮,說明他們倆挨著dist[i]=g[s][i];}}//正式進入dijkstra循環while(1){//找到未收錄集合中最小的distint v=findmin();cout <<v<<endl;if(v==-1){break; //如果此點不存在就跳出循環}collect[v]=true;//找到點了,收錄進去//更新最小距離//找v的鄰接點for(int i=1;i<=n;i++){//若i是v的鄰接點且未被收錄if(g[v][i]!=0x3f3f3f3f&&!collect[i]){//若收錄i使得dist[i]減小,更新if(dist[v]+g[v][i]<dist[i]){dist[i]=dist[v]+g[v][i];path[i]=v;}}}}}int main(){scanf("%d %d",&n,&m);//初始化memset(g,0x3f,sizeof(g));//初始化鄰接矩陣 沒有直接相連的兩點,其g[n][m]=infinitymemset(path,-1,sizeof(path));//初始化路徑-1memset(dist,0x3f,sizeof(dist));//dist[]距離為正無窮,否則無法更新//m條邊進行輸入進去while(m--){ int x,y,z;scanf("%d %d %d",&x,&y,&z);g[x][y]=min(g[x][y],z);//排除重邊的影響。 重邊時,取最短路就可}//執行函數dijkstra(1); //在這里我們傳入起點1//到最后如果dist[n]沒有被更新,說明n點陷入環中了if(dist[n]==0x3f3f3f3f){printf("-1");}else{printf("%d",dist[n]);}return 0;
}
總結
以上是生活随笔為你收集整理的Acwing--朴素dijkstra的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “夕吸秋石髓”上一句是什么
- 下一篇: 四星宠物和三星宠物的本质区别是什么?