您的位置:首页 > 其它

Dijkstra算法

2016-07-11 12:44 183 查看
《数据结构与算法分析——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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: