//star:单源起点
//n:结点数目
void dijkstra(int star, int n)
{
int i, j, min, x, y;
//初始化d[], v[]
memset(done, false, sizeof (done));
for (i = 0; i != n; i++)
d[i] = INF;
//设置起点
d[star] = 0;
//规定起点的父母也是自己
par[star] = star;
//循环n次
for (j = 0; j != n; j++){
//选择d值最小的点作为起点x(d[x]已经确定了)
min = INF;
for (i = 0; i != n; i++) {
if (done[i] == false && d[i] < min) {
min = d[i];
x = i;
}
}
//x的d[i]已经确定了
done[x] = 1;
//对所有x的边(x, y)
for (y = 0; y != n; y++) {
if (w[x][y] != 0 && d[y] > d[x]+w[x][y]) {
d[y] = d[x]+w[x][y];
par[y] = x;
}
}
} //循环n次
}
void printPath(int star, int i)
{
//到祖先了
if (star == i) {
cout << i << " ";
return;
}
printPath(star, par[i]);
cout << i << " ";
}
转载于:https://my.oschina.net/lfxu/blog/361120