1. 程式人生 > 實用技巧 >Dijkstra演算法

Dijkstra演算法

#include<iostream>
#define INF 10000    //取合適的值作為無窮大表示無邊
using namespace std;

int n=7; //頂點數
int G[7][7]=
{
    {INF,9,INF,INF,INF,INF,INF},
    {9,INF,12,5,INF,INF,7},
    {INF,12,INF,6,INF,INF,INF},
    {INF,5,6,INF,14,8,INF},
    {INF,INF,INF,14,INF,3,INF},
    {INF,INF,INF,8,3,INF,10},
    {INF,7,INF,INF,INF,10
,INF} }; //圖的鄰接矩陣 void Dijkstra(int v0) { int minCostPer[n],join[n];//minCostPer[]存的是各個節點到起點的路徑最小值 int minValue,path[n];//path[]存的最短路徑上,當前節點的前一個節點 int v=v0; for(int i=0; i<n; i++) { minCostPer[i]=G[v][i]; join[i]=0; if(G[v][i]<INF) { path[i]
=v; } else { path[i]=-1; } } join[v]=1;//起點加入路徑 path[v]=-1;//起點沒有前一個節點,標記為-1 for(int i=0; i<n-1; i++) { minValue=INF; for(int j=0; j<n; j++) { if(join[j]==0&&minCostPer[j]<minValue) { minValue
=minCostPer[j]; v=j; } } join[v]=1; for(int j=0; j<n; j++) { if(join[j]==0&&G[v][j]<INF&&minCostPer[v]+G[v][j]<minCostPer[j]) { minCostPer[j]=minCostPer[v]+G[v][j]; path[j]=v; } } } for(int i=0; i<n; i++) { cout<<minCostPer[i]<<" "; } } int main() { Dijkstra(0);//以符號標誌為0的節點作為起點 /* path[]裡的元素值應為:-1 0 3 1 5 3 1 minCostPer[]裡的元素值應為:10000 9 20 14 25 22 16 */ return 0; }