與prim演算法樸素版實現起來差不多。。。
//樸素版dijkstra演算法
//輸入乙個圖的矩陣,假定兩點不相鄰則權值為0
//輸出每個頂點的最短路徑長度,可以列印指定頂點的路徑
//dijkstra演算法跟prim演算法很像
//相同的地方是:
//兩者都有乙個已經求得"mst"和已經求得"最短路"的集合
//每納入乙個結點x到集合,更新的是集合外與x直接相連的點的key或者d;
//不同地方就是:
//prim中,key的意義是某點到集合 與之最近元素 的邊權
//dijkstra中,d的意思是某點到集合 給定起點元素 的最"短"路的邊權和
/*dijkstra演算法
每個頂點清除標記;
d[起點] = 0, d[其他點] = inf;
迴圈n次
*/ /*
參考測試資料
**——wiki百科的dijkstra演算法gif動態圖
輸入點的個數(程式中程式設計從0開始)
輸入起點
輸入矩陣
輸入任意點(求其路徑)60
0 7 9 0 0 14
7 0 10 15 0 0
9 10 0 11 0 2
0 15 11 0 6 0
0 0 0 6 0 9
14 0 2 0 9 03*/
#include using namespace std;
const int n = 110;
const int inf = 999999999;
int w[n][n]; //鄰接矩陣
bool done[n]; //若d[i]不再更新,則done[i]=true, 也即結點納入了解集
int d[n]; //d[i]記錄從起點到結點i的最短路徑長度
int par[n]; //par[i]儲存記錄i的父親結點
//建立圖
void creategraph(int n)
//star:單源起點
//n:結點數目
void dijkstra(int star, int n)
} //x的d[i]已經確定了
done[x] = 1;
//對所有x的邊(x, y)
for (y = 0; y != n; y++)
} } //迴圈n次
}//star:單源起點
//i:當前結點
void printpath(int star, int i)
printpath(star, par[i]);
cout << i << " ";
}int main()
cout << endl;
cout << "依次列印從起點" << star
<< "到n個結點的最短距離:" << endl;
for (int i = 0; i != n; i++)
cout << endl;
cout << "請輸出結點編號[0, n-1],以列印其最短路徑經過的結點:" << endl;
cin >> end;//0 ~ n-1
printpath(star, end);
cout << endl;
return 0;
}
Dijkstra演算法求單源最短路徑
dijkstra演算法求單源最短路徑 include include define vexsize 100 建立鄰接矩陣 int creat int cost vexsize return vexnum dijkstra演算法 void dijkstra int cost vexsize int v...
Dijkstra演算法(求單源最短路徑)
dijkstra演算法 原鏈結 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容...
Dijkstra演算法求單源最短路徑
1.綜述 dijkstra演算法解決的是帶權重的有向圖上單源最短路徑問題,該演算法要求所有邊的權重都為非負值。演算法重複從結點集 v s中選擇最短路徑估計最小的結點 u 將 u 加入到集合 s 然後對所有從 u 出發的邊進行 鬆弛操作 相當於遍歷選出最小權值 使用乙個最小優先佇列 q 來儲存結點集合...