贪心算法-单源最短路径
算法流程:
(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)題。
- 上一篇: 建设部:住房公积金济富论不符合实际
- 下一篇: sql语句的查询