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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

贪心算法-单源最短路径

發(fā)布時(shí)間:2024/5/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心算法-单源最短路径 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法流程:

(a)?初始化:用起點(diǎn)v到該頂點(diǎn)w的直接邊(弧)初始化最短路徑,否則設(shè)為∞;

(b)?從未求得最短路徑的終點(diǎn)中選擇路徑長(zhǎng)度最小的終點(diǎn)u:即求得v到u的最短路徑;

(c)?修改最短路徑:計(jì)算u的鄰接點(diǎn)的最短路徑,若(v,…,u)+(u,w)<(v,…,w),則以(v,…,u,w)代替。同時(shí),用path記錄每個(gè)節(jié)點(diǎn)最短路徑的前導(dǎo)節(jié)點(diǎn)。

(d)?重復(fù)(b)-(c),直到求得v到其余所有頂點(diǎn)的最短路徑。

一共有N個(gè)節(jié)點(diǎn),出發(fā)結(jié)點(diǎn)為V0,需要一個(gè)一維數(shù)組path[N]來(lái)記錄前一個(gè)節(jié)點(diǎn)序號(hào),一個(gè)一維數(shù)組dist[N]來(lái)記錄從原點(diǎn)到當(dāng)前節(jié)點(diǎn)最短路徑(初始值為V0到Vi的邊的權(quán)值,沒(méi)有則為+∞,這里用MAX=65536來(lái)代替無(wú)窮大),一個(gè)二維數(shù)組cost[N][N]來(lái)記錄各點(diǎn)之間邊的權(quán)重,按以上流程更新path[N]和dist[N]。

測(cè)試:

測(cè)試用例用的是課件的例子,總共有7個(gè)節(jié)點(diǎn),打印從節(jié)點(diǎn)1到別的節(jié)點(diǎn)的最短路徑。

輸出路徑,主要用遞歸輸出,printpath打印每個(gè)節(jié)點(diǎn)的前面的節(jié)點(diǎn),直至到第一個(gè)節(jié)點(diǎn)。

#include <iostream>using namespace std; //點(diǎn)的個(gè)數(shù)大小 #define N 7 //用MAX表示無(wú)窮大 #define MAX 65536/* G是一個(gè)N結(jié)點(diǎn)有向圖,它由其成本鄰接矩陣cost(n,n)表示DIST(j)被置 以結(jié)點(diǎn)v到結(jié)點(diǎn)j的最短路徑長(zhǎng)度,這里1≤j≤n。DIST(v)被置成零,path 用于記錄路徑 */ void SHORTEST_PATHS(int v,int cost[N][N],int dist[N],int path[6],int n) {//visit數(shù)組,記錄訪問(wèn)過(guò)的節(jié)點(diǎn),訪問(wèn)過(guò)置為1,否則置為0//初始化全為0int visit[N] = {0};for(int i=0;i<N;++i){//別的點(diǎn)到V0點(diǎn)的初始化距離dist[i] = cost[0][i];//path數(shù)組用于記錄路徑,記錄前面的節(jié)點(diǎn)if(dist[i] != MAX)path[i] = 0;}//將V0點(diǎn)置為1表示訪問(wèn)過(guò)visit[0] = 1;dist[0] = 0;for(int i=1;i<N;++i){int u;int temp = MAX;for(int j=0;j<N;++j){if(visit[j]==0 && dist[j]<temp){//u用來(lái)記錄下一個(gè)被選入集合S的點(diǎn)u = j;temp = dist[j];}}visit[u] = 1;//更新所有點(diǎn)的距離for(int j=0;j<N;++j){if(visit[j] == 0){//如果加入的點(diǎn)使得距離變小了,就更新int newdist = dist[u]+cost[u][j];if(newdist < dist[j]){dist[j] = newdist;path[j] = u;}}}} } //遞歸打印路徑 void printpath(int path[],int end) {if(end == 0)return;printpath(path,path[end]);printf("V%d",path[end]); }int main() {//測(cè)試用例,來(lái)自課件int cost[N][N] = {{0,20,50,30,MAX,MAX,MAX},{MAX,0,25,MAX,MAX,70,MAX},{MAX,MAX,0,40,25,50,MAX},{MAX,MAX,MAX,0,55,MAX,MAX},{MAX,MAX,MAX,MAX,0,10,70},{MAX,MAX,MAX,MAX,MAX,0,50},{MAX,MAX,MAX,MAX,MAX,MAX,0},};int dist[N];int path[N];SHORTEST_PATHS(0,cost,dist,path,N);cout<<"start\tend\tlength\tnodes list"<<endl;//格式化輸出for(int i=1;i<N;++i){cout<<"V0\tV"<<i<<"\t"<<dist[i]<<"\t";printpath(path,i);cout<<"V"<<i<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的贪心算法-单源最短路径的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。