基本思路
将起点作为当前点,先遍历当前点关联的边,将边关联的另一点的权重等同于边的权重。再将点位跳转至距离起点距离最近的已知且未访问过的点,再次遍历所有关联的边,除了已经访问过 (作为当前点过) 的点关联的边,将其权重设为当前点权重加边的权重,若其已有权重则取两者之间最小值。如此往复直至无可跳转的点。
void Dijkstra(int** input, int ans[], int n)
{
//假定起点为[0]
ans[0] = 0;
int myThis = 0;
int visited[n] = {0};
while(1)
{
visited[myThis] = 1;
int min = input[myThis][0];
int mini = 0;
int flag = 0;
for(int j = 0; j < n; j++)
{
if(input[myThis][j] != 0 && visited[j] != 1)
{
flag = 1;
if(min == 0 || min > input[myThis][j])
{
mini = j;
min = input[myThis][j];
}
if(ans[j] > ans[myThis] + input[myThis][j] || ans[j] == 0)
{
ans[j] = ans[myThis] + input[myThis][j];
}
}
}
if(flag == 1)
{
myThis = mini;
}
else
{
break;
}
}
}