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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(dijkstra算法+多权值)最短路径问题

發布時間:2025/3/12 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (dijkstra算法+多权值)最短路径问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。
Input
輸入n,m,點的編號是1~n,然后是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最后一行是兩個數 s,t;起點s,終點。n和m為0時輸入結束。
(1< n< =1000, 0< m< 100000, s != t)
Output
輸出 一行有兩個數, 最短距離及其花費。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11

分析與解答

這題我調試了八個小時
我總結一下我對dijkstra的認識

1.dijkstra算法可以求從單個源點出發到所有結點的最短路,這個題就是坑到這了,我寫兩個參數就wrong answer了,就是說,你調用這個函數只需要一個參數,就是起點。終點是n已經固定了,現在你說終點是t,哪怕走到終點n的路不經過t,你輸出dis[t],也是從起點到t的最短路。

每標記一次就說明被標記的這個數的dis已經確定了。我們循環n次目的就是為了標記n次確定n個數的dis。我們初始化起點的dis是0其他的是inf,我們循環n次,第一個確定下來的就是起點。然后標記,注意這個標記是在那n次循環里的。
2.這個題第二個坑就是,兩個點之間的路有多條,如果路的距離相同時,還要找花費最小的

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define INF 100100 using namespace std;int vis[1100];int dis[1100]; int map[1100][1100]; int value[1100][1100]; int v[1100]; int n; void dijkstra(int s){memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i){dis[i]=INF;v[i]=INF;}dis[s]=v[s]=0;for(int i=1;i<=n;++i){//循環n次,每一次都選一個點標記上int x,m=INF;for(int y=1;y<=n;++y){//所有未標號節點中選dis最小的結點if(!vis[y]&&dis[y]<=m)m=dis[x=y];}vis[x]=1;for(int y=1;y<=n;++y)//從x出發的所有邊(x,y),更新dis[y]{ if (dis[y] > dis[x] + map[x][y]){dis[y]= dis[x]+map[x][y];v[y] = v[x] + value[x][y];}else if (dis[y] == dis[x] + map[x][y] && v[y] > v[x] + value[x][y]){v[y] = v[x] + value[x][y];}}} }int main() {int m;int a,b,c,p;int s,t;while(cin>>n>>m){if(m==0&&n==0) return 0;//// memset(v,INF,sizeof(v));memset(map,INF,sizeof(map));memset(value,INF,sizeof(value));for(int i=0;i<m;++i){scanf("%d%d%d%d",&a,&b,&c,&p);if(c<map[a][b]){map[a][b]=map[b][a]=c;value[a][b]=value[b][a]=p;}if(c==map[a][b]&&value[a][b]>p){value[b][a]=value[a][b]=p;}}scanf("%d%d",&s,&t);dijkstra(s);printf("%d %d\n",dis[t],v[t]);} }

總結

以上是生活随笔為你收集整理的(dijkstra算法+多权值)最短路径问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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