日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Acwing--朴素dijkstra

發布時間:2023/11/27 生活经验 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。