最短路徑問題:
從圖的乙個頂點出發,到達圖的另乙個頂點的最短路徑
解法:
迪傑斯特拉演算法(dijkstra演算法)
弗洛伊德演算法(floyd演算法)
spfa演算法
dijkstra演算法介紹
主要是通過廣度優先遍歷,對每個點進行鬆弛操作找到源點到其他每個點的最短路徑
具體實現流程:
一、初始化圖
1、首先定義圖的結構體包含鄰接陣列和頂點陣列
2、然後輸入每乙個頂點的值,然後按輸入頂點順序來輸入鄰接陣列的每個值
3、為了方便自己到自己可以設定為0,沒有路徑設定為-1,有路徑設定路徑值
4、對鄰接陣列進行加工,把距離為-1的設定為預設的無窮大
二、通過dijkstra求最短路徑
思想:通過乙個距離陣列不斷鬆弛求最短路徑,鬆弛過程中記錄通過的點
第一次將源點的資料記錄到距離陣列並將源點標記,然後依次找最近的未標記的點進行鬆弛操作,所有的點標記後得到的陣列就是到其他每個點的最短距離,可以通過前驅節點來找到對應的路徑。
鬆弛操作:比如1 2 3 4四個頂點求1到4的最短路徑,首先加入1,通過鄰接矩陣得到1到其他每個點的最短路徑,然後加入離1最近的點(比如3),鬆弛 其他距離(判斷1到2的直接距離小還是通過3到2 的間接距離小)(判斷1到4的直接距離小還是通過3到4的間接距離小),依次對其他每個未標記的點進行判斷取最小
5、首先定義需要的陣列,包含used判斷每個頂點是否已經被標記
6、通過距離陣列記錄源點到其他點的距離
7、前驅節點陣列用來記錄當前節點離源點最近的路徑的上乙個點,用來尋找最短路徑
8、初始化陣列,標記陣列都設定為未標記,源點設定為已標記,距離陣列讀取鄰接矩陣中源點的行,前驅節點都設定為自己
9、從源點開始找最近的點一次進行鬆弛操作,找到最近且未標記的點,判斷到其他未標記的點是不是可以通過這個新加入的點所短路徑,如果可以縮短就修改距離和前驅階段,直到所有頂點都被標記
10、通過前驅節點陣列找到對應路徑,通過距離陣列得到最短值。
實現**:
#include #include#include
#define maxsize 20
#define infinity 666typedef
char
vertextype;
//定義圖 的鄰接矩陣表示法結構
typedef struct
graph graph;
//鄰接矩陣法圖的生成函式
void creategraph( graph *g )
//求圖的頂點數
intcalvernum( graph g )
//將不鄰接的頂點之間的權值設定為infinity
void setweight( graph *g )
}}//
dijkstra求最短路徑函式
void
dijkstra( graph g )
printf(
"\n\n");
printf(
"讀取到的鄰接矩陣為(666表示無窮大)\n");
for( i=0; i)
printf("\n
");}
printf("\n
");printf(
"請輸入起點和終點(空格隔開):");
char
a,b;
intst,en;
fflush(stdin);
scanf(
"%c %c
",&a,&b);
for( i=0; i)
if(g.ver[i] ==b)
}for( i=0; i)
used[st] = 1
;
for( i=0; i1; i++)
}used[j] = 1
;
for( n=0; n)
}}
char ans [20
];
int dq=st,dw=en;
int pathnum=0
; ans[pathnum++] =g.ver[dw];
while(g.ver[dw]!=g.ver[dq])
printf(
"\n路徑是:");
for( i=pathnum-1; i>=0; i--)
else
} printf(
"\n\n");
if(distance[en]==666
) else
}int
main()
檔案內容:
1234
0 1 -1 3
-1 0 2 4
-1 -1 0 5
-1 -1 -1 0
很經典,思想也很簡單
Dijkstra最短路徑演算法
基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...
Dijkstra最短路徑演算法
引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...
最短路徑 Dijkstra演算法
最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...