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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最短路径算法整理(二)

發布時間:2024/8/24 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最短路径算法整理(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?本文是最短路徑算法整理的第二篇,想閱讀第一篇的朋友能夠點擊下面鏈接:

? ? ? ? http://blog.csdn.net/hjd_love_zzt/article/details/26739593


? ? ? ?這一篇博客繼續以一些OJ上的題目為載體,整理一下最短路徑算法。會陸續的更新。。。


? ? ? 1、HDU 2544

? ? ? 題目與分析:這道題抽象一下,還是:“求a到b的最短路徑”。。所須要的基本條件是:點數、邊數、起點、終點

? ? ? 下面給出floyd、dijkstra、bellmanford三種最短路徑算法關于這道題的解法:

? ? ??

? ? ?1)floyd

? ? ?

/** HDU_2544.cpp** Created on: 2014年5月31日* Author: Administrator*/#include <iostream> #include <cstdio>using namespace std;const int maxn = 105; const int inf = 10000005;int e[maxn][maxn]; int n;void initial(){int i;int j;for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= n ; ++j){if(i == j){e[i][j] = 0;}else{e[i][j] = inf;}}} }void floyd(){int k;int i;int j;for(k = 1 ; k <= n ; ++k){for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= n ; ++j){if(e[i][j] > e[i][k] + e[k][j]){e[i][j] = e[i][k] + e[k][j];}}}} }int main(){int m;while(scanf("%d%d",&n,&m),n||m){initial();int i;for(i = 1 ; i <= m ; ++i){int a,b,c;scanf("%d%d%d",&a,&b,&c);e[a][b] = e[b][a] = c;}floyd();printf("%d\n",e[1][n]);}return 0; }

? ?2)dijkstra

/** HDU_2544.cpp** Created on: 2014年5月31日* Author: Administrator*/#include <iostream> #include <cstdio>using namespace std;const int maxn = 105; const int inf = 10000005;int n; int s[maxn]; int dis[maxn]; int map[maxn][maxn];int target;int dijkstra(int v){int i;for(i = 1 ; i <= n ; ++i){s[i] = 0;dis[i] = map[v][i];}// dis[v] = 0;//事實上上面的操作已經包括這個意思了int j;for(i = 1 ; i < n ; ++i){int min = inf;int pos;for(j = 1 ; j <= n ; ++j){if(!s[j] && dis[j] < min){min = dis[j];pos = j;}}s[pos] = 1;for(j = 1 ; j <= n ; ++j){if(dis[j] > dis[pos] + map[pos][j]){dis[j] = dis[pos] + map[pos][j];}}}return dis[target]; }int main(){int m;while(scanf("%d%d",&n,&m),n||m){int i;int j;for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= n ; ++j){if(i == j){map[i][j] = 0;}else{map[i][j] = inf;}}}for(i = 1 ; i <= m ; ++i){int a,b,c;scanf("%d%d%d",&a,&b,&c);map[a][b] = map[b][a] = c;}target = n;int result = dijkstra(1);printf("%d\n",result);}return 0; }

3)bellmanford

/** HDU_2544.cpp** Created on: 2014年5月31日* Author: Administrator*/#include <iostream> #include <cstdio>using namespace std;struct Edge{int u;int v;int weight; };const int maxn = 105; const int maxm = 10005; const int inf = 1000005;Edge edge[maxm]; int dis[maxn];int n,m; int source;bool bellmanford(){int i;int j;for(i = 1 ; i <= n ; ++i){dis[i] = inf;}dis[source] = 0;for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= m ; ++j){if(dis[edge[j].v] > dis[edge[j].u] + edge[j].weight){dis[edge[j].v] = dis[edge[j].u] + edge[j].weight;}if(dis[edge[j].u] > dis[edge[j].v] + edge[j].weight){dis[edge[j].u] = dis[edge[j].v] + edge[j].weight;}}}for(j = 1 ; j <= m ; ++j){if(dis[edge[j].v] > dis[edge[j].u] + edge[j].weight){return false;}}return true; }int main(){while(scanf("%d%d",&n,&m),n||m){int i;for(i = 1 ; i <= m ; ++i){scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].weight);}source = 1;bellmanford();printf("%d\n",dis[n]);}return 0; }

2、HDU 2066 一個人的旅行

題目分析:

? ? ?這一道題還是最短路徑問題。可是有下面幾個不同點:

? ? ?1》與尋常的給出點數、邊數、起點、終點不同。這道題給出了多個起點和終點、而且沒有給出點數

? ? ?


這道題我用floyd做的時候TLE了,所以臨時僅僅給出dijkstra解法的版本號

/** HDU_2066.cpp** Created on: 2014年6月1日* Author: Administrator*/#include <iostream> #include <cstdio>using namespace std;const int maxn = 1010; const int inf = 100000005;int s[1015]; int dis[1015]; int map[1015][1015];int start, d;int from[maxn]; int want[maxn];int dijkstra(int v) {int i;for (i = 1; i <= maxn; ++i) {//由于題目沒有給出點數,所以每一次都所有掃一遍s[i] = false;dis[i] = map[v][i];}for (i = 1; i < maxn; ++i) {int min = inf;int pos;int j;for (j = 1; j <= maxn; ++j) {if (!s[j] && dis[j] < min) {min = dis[j];pos = j;}}s[pos] = 1;for (j = 1; j <= maxn; ++j) {if (!s[j] && dis[j] > dis[pos] + map[pos][j]) {dis[j] = dis[pos] + map[pos][j];}}} //到這里就已經算出以點v為起點的最短路徑的情況了....這時候再遍歷一下ends[],便能求出v到ends[]中哪個終點近期了int minn = inf;for (i = 0; i < d; ++i) {//用來解決多終點的問題int temp = dis[want[i]];if (minn > temp) {minn = temp;}}return minn; }int main() {int t;while (scanf("%d%d%d", &t, &start, &d) != EOF) {int i;int j;for (i = 1; i <= maxn; ++i) {for (j = 1; j <= maxn; ++j) {if (i == j) {map[i][j] = map[j][i] = 0;} else {map[i][j] = map[j][i] = inf;}}}for (i = 1; i <= t; ++i) {int a, b, c;scanf("%d%d%d", &a, &b, &c);if (map[a][b] > c) {map[a][b] = map[b][a] = c;}}for (i = 0; i < start; ++i) {scanf("%d", &from[i]);}for (i = 0; i < d; ++i) {scanf("%d", &want[i]);}int result = inf;for (i = 0; i < start; ++i) {//用來解決多起點的問題int temp = dijkstra(from[i]);if (result > temp) {result = temp;}}printf("%d\n", result);}return 0; }






轉載于:https://www.cnblogs.com/gcczhongduan/p/4297716.html

總結

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

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