1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <stdio.h>
#include <string.h>
#define INF 10000
/*INF表示不存在边的长度,用一个很大的数表示它*/
void dijkstra(int w[][21], int [], int n);
int main(void)
{
int n, i, j;
int w[21][21], d[21];
//freopen("dijkstra.in", "r", stdin); //打开文件
//freopen("dijkstra.out", "w", stdout);
scanf("%d", &n); //读入n
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
scanf("%d", &w[i][j]); //读入数据,不存在的边是0
if(w[i][j] == 0) w[i][j] = INF; //把不存在的边0,改成一个很大的数字
}
dijkstra(w, d, n); //调用算法函数
for(i = 0; i < n; i++) //打印结果
printf("%d ", d[i]);
return 0;
}
void dijkstra(int w[][21], int d[], int n)
{
int v[21];
int i, y, x, m;
memset(v, 0, sizeof(v)); //v作为是否访问的标志,0表示没有访问,1表示已经访问
for(i = 0; i < n; i++) d[i] = (i == 0 ? 0 : INF);
for(i = 0; i < n; i++)
{
m = INF;
for(y = 0; y < n; y++) if(!v[y] && d[y] <= m) m = d[x = y];
v[x] = 1;
for(y = 0; y < n; y++) if(d[y] > d[x] + w[x][y]) d[y] = d[x] + w[x][y];
}
}
|