原理:对于源顶点v0,首先选择其直接相邻的顶点中长度最短的顶点vi,那么根据已知可得,v0经过vi到达与vi直接相邻的顶点vj的最短距离 dist[j] 为 matrix[v0][j] 与 dist[i] + matrix[i][j] 中的最小值,即dist[j] =min{ matrix[v0][j] , dist[i] + matrix[i][j] }.
typedef struct node
{
int matrix[N][M];
int n;
int e;
}MGraph;
void DijkstraPath(MGraph g, int*dist, int*path, int v0)
{
int i, j, k;
bool *visited = (bool*)malloc(sizeof(bool)*g.n);
for (i = 0;i < g.n;++i)
{
if (g.matrix[v0][i] > 0 && i != v0)
{
dist[i] = g.matrix[v0][i];
path[i] = v0;
}
else
{
dist[i] = INT_MAX;
path[i] = -1;
}
visited[v0] = false;
path[v0] = v0;
dist[v0] = 0;
}
visited[v0] = true;
for (i = 1;i < g.n;++i)
{
int min = INT_MAX;
int u;
for (j = 0;j < g.n;++j)
{
if (visited[j] == false && dist[j] < min)
{
min = dist[j];
u = j;
}
}
visited[u] = true;
for (k = 0;k < g.n;++k)
{
if (visited[k] == false && g.matrix[u][k] > 0 && min + g.matrix[u][k] < dist[k])
{
dist[k] = min + g.matrix[u][k];
path[k] = u;
}
}
}
}