【问题描述】
假设一个带权有向图采用邻接表存储,设计求源点v到其他顶点最短路径的Dijkstra算法。
【输入形式】
第一行顶点个数n,边数,第二行到第n+1行是邻接矩阵
【输出形式】
从顶点0依次输出到其它每个顶点的最短路径序列
【样例输入】
7 12
0 4 6 6 32767 32767 32767
32767 0 1 32767 7 32767 32767
32767 32767 0 32767 6 4 32767
32767 32767 2 0 32767 5 32767
32767 32767 32767 32767 0 32767 6
32767 32767 32767 32767 1 0 8
32767 32767 32767 32767 32767 32767 0
【样例输出】
4 5 6 10 9 16
【样例说明】
数字32767代表∞,说明两个顶点不相连
【评分标准】
#include<iostream>
using namespace std;
const int MAX = 32767;
class Dijkstra {
private:
int vexnum;
int arcnum;
bool* in_s;
int* D;
int** g;
public:
void create();
void shortest_path();
};
void Dijkstra::create()
{
cin >> vexnum >> arcnum;
in_s = new bool[vexnum]();
D = new int[vexnum];
g = new int* [vexnum];;
for (int i = 0; i < vexnum; i++) {
g[i] = new int[vexnum];
for (int j = 0; j < vexnum; j++) {
g[i][j] = MAX;
}
}
int temp;
for (int i = 0; i < vexnum; i++)
for (int j = 0; j < vexnum; j++) {
cin >> temp;
if (temp != 0 && temp != MAX)g[i][j] = temp;
}
for (int i = 0; i < vexnum; i++) {
D[i] = g[0][i];
}
}
void Dijkstra::shortest_path()
{
in_s[0] = true;
for (int v = 0; v < vexnum-1; v++) {
int j = 0;
while (in_s[j])j++;
for (int i = j + 1; i < vexnum; i++)
if (!in_s[i] && D[i] < D[j])j = i;
in_s[j] = true;
for (int k = 0; k < vexnum; k++)
if (!in_s[k] && (D[j] + g[j][k] < D[k]))
D[k] = D[j] + g[j][k];
}
cout << endl;
for (int i = 0; i < vexnum; i++) {
if (D[i] != MAX)cout << D[i] << " ";
}
}
int main() {
Dijkstra d;
d.create();
d.shortest_path();
}