算法介紹
迪杰斯特拉算法是由荷蘭計算機科學家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是從一個頂點到其余各頂點的最短路徑算法,解決的是有向圖中最短路徑問題。迪杰斯特拉算法主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra算法能得出最短路徑的最優解,但由于它遍歷計算的節點很多,所以效率低。
算法思想
按路徑長度遞增次序產生算法:
把頂點集合V分成兩組:
?。?)S:已求出的頂點的集合(初始時只含有源點V0)
?。?)V-S=T:尚未確定的頂點集合
將T中頂點按遞增的次序加入到S中,保證:
?。?)從源點V0到S中其他各頂點的長度都不大于從V0到T中任何頂點的最短路徑長度
(2)每個頂點對應一個距離值
S中頂點:從V0到此頂點的長度
T中頂點:從V0到此頂點的只包括S中頂點作中間頂點的最短路徑長度
依據:可以證明V0到T中頂點Vk的,或是從V0到Vk的直接路徑的權值;或是從V0經S中頂點到Vk的路徑權值之和
應用舉例
(1)題目:編寫一個校園導游程序,為來訪的客人提供各種信息查詢服務。
主要功能:1.設計學校的校園平面圖,所含景點不少于10個:頂點表示景點,邊表示路徑等;
2.為客人提供圖中任意景點相關信息的查詢;
3.為客人提供圖中任意景點的問路查詢,即查詢人以景點間的一條最短路徑。
要求:1.設計一個主界面;
2.設計功能菜單,供用戶選擇
3.有一定的實用性。
(2)設計思路:
1、該題主要有算法思路以及程序的邏輯思路,首先從邏輯思路講,進入程序,首先設計一個主菜單,選項有景點信息查詢,最短路徑查詢以及顯示景點的平面視圖三個子菜單,然后根據用戶的輸入選擇的子菜單前的編號,分進入不同的子菜單;該功能是由if….else if…. 語句實現。在景點信息查詢和最短路徑查詢子菜單下還有二級子菜 單,都是列 出所有景點并在前面編號,查詢景點信息時,輸入景點前面的編號即可,查詢最短路徑時,先輸入起點的編號,再輸入終點的編號。而顯示景點視圖則調用景點平面圖函數即可顯 示。
2、算法思路主要是迪杰斯特拉算法的思路,利用迪杰斯特拉算法求最短路徑。
3、先定義好圖的儲存結構,本題采用鄰接矩陣的方式來表示圖,并在主函數中初始化該圖;
4、定義三個全局一維數組,一個bool類型數組S[]用來記錄從v0到vi是否已經確定了最短路徑,是則記S[i]=true
,否記S[i]= flase
;一個int 類型數組Path[]
用來記錄從v0到vi的當前最短路徑上的vi的直接前驅頂點編號,若v 到vi之間有邊則記Path[i] = v
的編號,否則記Path[i] = -1
;最后一個數組D[]用來記錄從v0到vi之間的最短路徑長度,存在則記v0到vi之間邊的權值或者權值和,否則記為MAX
5、定義一個求最短路徑的函數,傳入的參數為圖和起點,首先進行初始化工作,初始化S[]數組全為false,D[]數組初始化為起點到各個頂點的權值,Path[]數組初始化為起點是否與各頂點有邊,有則記v0否則記-1;
6、然后進行n-1次for循環,找出vo到其余n-1個頂點之間的最短路徑,比較當前D[]數組中最小值,找到最小值的編號v,該編號就是從v0出發到所有頂點中距離最短的頂點編號,然后把S[v]的值置為true。說明從v0出發到頂點v已經找到最短路徑;
7、接著就要更新D[]數組,因為D[]數組是記錄最短路徑的,現在已經找到了一個頂點的最短路徑,已該頂點v為中間點,判斷從該頂點v出發到剩下的頂點的路徑長度加上該點到v0的路徑長度是否小于直接從v0出發到其余頂點的路徑長度,如果小于,則更新D[i]為以該頂點v為中間點求得的路徑長度。更新Path[i] = v
;即i的前驅不再是v0而是v;
8、循環(6)(7)兩步n-1次即可得到D[]數組,輸出D[]數組既是v0到所有頂點的最短路徑長度;
(3)源代碼:
#include<iostream>#include<fstream>#include<string>using namespace std;/** *作者:Dmego *時間:2016-12-12 */#define MAX 1000000 //表示極大值∞#define max 10bool S[max]; //記錄從源點V0到終點Vi是否已經確定為最短路徑,確定了記true,否則記falseint Path[max]; //記錄從源點V0到終點Vi的當前最短路徑上終點Vi的直接前驅頂點序號,若V0到Vi之間有邊前驅為V0否則為-1 int D[max]; //記錄源點到終點之間最短路徑的長度,存在記V0到Vi的邊的權值,否則記為MAX typedef struct{ string vexs[max]; //頂點表 int arcs[max][max]; //鄰接矩陣 int vexnum, arcnum; //圖當前點數和邊數}AMGraph;//利用迪杰斯特拉算法求最短路徑void ShortestPath_DIJ(AMGraph &G, int v0){//使用迪杰斯特拉算法求有向網G中的V0 定點到其余頂點的最短路徑 int n = G.vexnum;//頂點數 for (int v = 0; v < n; v++)//n個頂點依次初始化 { S[v] = false;//S初始化為空集 D[v] = G.arcs[v0][v];//將v0到各個終點的最短路徑長度初始化為邊上的權值 if (D[v] < MAX) Path[v] = v0;//如果v0和v之間有邊,則將v的前驅初始化為v0 else Path[v] = -1;//如果v0和v之間無邊,則將v的前驅初始化為-1 } S[v0] = true; //將v0加入s D[v0] = 0;//源點到源點的權值為0 //---------初始化結束,開始主循環,每次求得v0到某個頂點的最短路徑,將v加到S數組 for (int i = 1; i < n; i++)//依次對其余n-1個頂點進行計算 { int min = MAX; int v = v0; for (int w = 0; w < n; w++) { if (!S[w] && D[w] < min) {//選擇一條當前最短路徑,終點為v v = w; min = D[w]; } S[v] = true;//將v加到s集合中 for (int w = 0; w < n; w++) {//更新從v0出發到集合V-S上所有頂點的最短路徑長度 if (!S[w] && (D[v] + G.arcs[v][w] < D[w])) { D[w] = D[v] + G.arcs[v][w];//更新D[w] Path[w] = v;//更改w的前驅為v } } } }}//背景函數void backGround(){ cout << "|*****************************************************************|" << endl; cout << " |------------------------鐵大旅游景點圖-----------------|" << endl; cout << "|*****************************************************************|" << endl; cout << "| ⑦ 單位:米 |" << endl; cout << "| 九教 |" << endl; cout << "| ◎ ⑧ |" << endl; cout << "| 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb 青草热久免费精品视频| 成人激情在线播放| 欧美激情成人在线视频| 国产精品爽黄69天堂a| 国产区亚洲区欧美区| 日韩欧中文字幕| 成人a在线观看| 国模吧一区二区三区| 日韩免费中文字幕| 欧美日韩福利视频| 91成人性视频| 国产精品久久久久久久一区探花| 亚洲一区免费网站| 日韩av高清不卡| 亚洲美女在线观看| 国产免费一区二区三区在线能观看| 精品国产欧美成人夜夜嗨| 日韩美女在线观看一区| 日韩欧美一区二区三区久久| 欧美老女人在线视频| 欧美激情综合亚洲一二区| 国内精品一区二区三区四区| 亚洲精品小视频在线观看| 神马国产精品影院av| 国内免费精品永久在线视频| 91在线视频一区| 欧美一级电影免费在线观看| 欧美在线播放视频| 欧美激情综合色综合啪啪五月| 久久久91精品国产一区不卡| 国产精品午夜一区二区欲梦| 中日韩美女免费视频网站在线观看| 久久免费国产精品1| 国产91在线高潮白浆在线观看| 亚洲人午夜精品免费| 精品在线观看国产| 亚洲欧洲在线视频| 国产午夜精品全部视频在线播放| 久久久久99精品久久久久| 久久成人av网站| 国产精品中文字幕在线| 国产脚交av在线一区二区| 亚洲一区二区三区乱码aⅴ| 国产一区二区日韩精品欧美精品| 日韩中文理论片| 久久九九精品99国产精品| 欧美成人第一页| 亚洲色图狂野欧美| 久久久精品国产网站| 国模吧一区二区| 欧美视频13p| 国产精品户外野外| 欧美久久精品一级黑人c片| 国产精品视频久久久| 欧美视频在线免费| 中文字幕一区二区三区电影| 国产精品精品久久久| 精品调教chinesegay| 亚洲在线免费看| 中文字幕在线亚洲| 伊人男人综合视频网| 岛国视频午夜一区免费在线观看| 尤物九九久久国产精品的特点| 久久天堂av综合合色| 中文字幕日韩综合av| 国产精品偷伦免费视频观看的| 亚洲最新在线视频| 国产在线日韩在线| 欧美在线视频网| 国产偷国产偷亚洲清高网站| 国产999视频| 久久伊人免费视频| 国产热re99久久6国产精品| 亚洲最大在线视频| 日韩欧美在线看| 日本成人在线视频网址| 欧美精品九九久久| 欧美性生交大片免网| 亚洲福利视频二区| 91精品国产高清久久久久久91| 欧美视频在线视频| 日本久久精品视频| www.久久草.com| 日韩高清av在线| 久久久久久尹人网香蕉| 亚洲性无码av在线| 亚洲精品动漫久久久久| 亚洲精品资源美女情侣酒店| 浅井舞香一区二区| 亚洲国产精久久久久久| 日韩av中文字幕在线免费观看| 国产精品天天狠天天看| 欧美午夜片欧美片在线观看| 亚洲成人精品视频在线观看| 91在线看www| 亚洲免费视频网站| 国产精品久久久久久超碰| 欧美性猛交xxx| 欧美日韩综合视频网址| 这里只有精品在线观看| 亚洲天堂网在线观看| 亚洲欧洲中文天堂| 国产精品成人观看视频国产奇米| 欧美日韩午夜剧场| 久久在精品线影院精品国产| 久久五月天综合| 国产精品成人久久久久| 高清欧美电影在线| 91成人天堂久久成人| 日韩av网站电影| 成人激情电影一区二区| 日韩va亚洲va欧洲va国产| 久久99亚洲热视| 国产精品亚洲自拍| 青草青草久热精品视频在线观看| 亚洲精品在线观看www| 日韩av中文字幕在线| 亚洲第一级黄色片| 日韩成人激情在线| 国产精品一区二区三区免费视频| 国产精品久久久久久久久久三级| 中文字幕精品一区久久久久| 精品国产一区av| 久久久久久久久中文字幕| 91av在线播放视频| 最近2019中文字幕一页二页| 国产在线视频91| 中文字幕亚洲一区二区三区| 久久免费视频网| 亚洲成年人影院在线| 欧美中文字幕在线| 日韩精品免费电影| 国产日韩欧美黄色| 久久久久久九九九| 国产综合色香蕉精品| 欧美老女人www| 亚洲а∨天堂久久精品喷水| 欧美精品一区二区免费| 亚洲精品日韩在线| 国产精品久久不能| 97人人模人人爽人人喊中文字| 日韩二区三区在线| 精品国内亚洲在观看18黄| 国产女人18毛片水18精品| 国产婷婷色综合av蜜臀av| 91免费高清视频| 日本伊人精品一区二区三区介绍| 国产精品爱久久久久久久| 日韩成人在线观看| 国语自产精品视频在线看| 成人性生交大片免费看小说| 国产精品福利久久久| 国产在线精品一区免费香蕉| 欧美成人免费观看| 久久成人在线视频| 国产亚洲精品激情久久| 懂色av一区二区三区| 亚洲精品自拍偷拍| 欧美日韩福利电影| 日韩精品在线视频观看| 国产精品v片在线观看不卡| 在线观看免费高清视频97| 欧美黑人巨大xxx极品| 中文字幕日本精品|