《数据结构与算法分析——C语言描述》 第九章
struct TableEntry {
int known;
double dist;
Vertex path;
};
typedef struct TableEntry* Table;//数组
Table initTable(Vertex start, Graph g) {
Table t;
t = (Table)malloc(sizeof(struct TableEntry)*vexNum);
int i;
for (i = 0; i < vexNum; i++) {
t[i].dist = DBL_MAX;
t[i].known = 0;
t[i].path = NOTAVERTEX;
}
t[start].dist = 0;
return t;
}
void printPath(Vertex v, Table t) {
if (t[v].known == 1) {
if (t[v].path != NOTAVERTEX) {//
printPath(t[v].path, t);
printf("to ");
}
printf("%s ", nameRecord[v]);
}
else
printf("can not arrive");
}
Vertex smallestUnknownDistanceVertex(Table t) {
double min = DBL_MAX;
Vertex v = NOTAVERTEX;
for (int i = 0; i < vexNum; i++) {
if (t[i].dist < min && t[i].known == 0) {
min = t[i].dist;
v = i;
}
}
return v;
}
void dijkstra(Table t, Graph g) {
Vertex v, w;
for (;;) {
v = smallestUnknownDistanceVertex(t);
t[v].known = 1;
if (v == NOTAVERTEX)
break;
EdgeNodePtr p = getEdgeNodePtr(v, g);
while (p) {
w = getVex(p);
if (t[w].known == 0) {
if (t[v].dist + getWeight(p) < t[w].dist) {
t[w].dist = t[v].dist + getWeight(p);
t[w].path = v;
}
}
p = advance(p);
}
}
for (int i = 0; i < vexNum; i++) {
printPath(i, t);
printf("\n");
}
}
int main() {
freopen("filein.txt", "r", stdin);
Graph g = readGraph();
Table t = initTable(0, g);
dijkstra(t, g);
}