今天就看了一个迪杰斯特拉算法,他的方法就是从一个顶点出发,找出这个到与它相关顶点的所有路径,然后在找出其中最小的,作为基量,一次类推;
代码如下:
# include <stdio.h>
# define INF 0x7fffffff
# define maxN 50
int matrix[maxN][maxN];
void Dijkstra(int out[], int N, int v0)
{
int i, j;
int visited[maxN] = {0};
int last_visited = 0;
for (i=0; i<N; i++)
out[i] = INF;
visited[v0] = 1;
out[v0] = 0;
for (i=0; i<N-1; i++)
{ //查看周围所有的点
for (j=0; j<N; j++)
{
if (visited[j] == 0)
{
if (matrix[v0][j] != 0)
{
int dist = matrix[v0][j] + last_visited;
if (dist < out[j])
out[j] = dist;
}
}
}
//找出最小值
int minIndex = 0;
while (visited[minIndex] == 1) //找到第一个未被访问的下标
minIndex++;
for (j=minIndex; j<N; j++) //假设第一个是最小的,依次往后遍历,但是不能排除后边的未被访问,所以要加上visited[j] == 0
{
if (visited[j] == 0 && out[j]<out[minIndex])
minIndex = j;
} //循环结束后,minIndex中保存的是最小的值得下标
last_visited = out[minIndex]; //更新最小值
visited[minIndex] = 1; //将最小值顶点选出
v0 = minIndex; //下次查找从最小值顶点开始
}
}
int main()
{
int result[maxN];
int N, i, j;
scanf("%d", &N);
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
{
scanf("%d", &matrix[i][j]);
}
}
Dijkstra(result, N, 0);
for (i=0; i<N; i++)
{
if (result[i] == INF)
printf("INF\n");
else
printf("%d\n", result[i]);
}
return 0;
}
集训第九天
最新推荐文章于 2024-10-17 17:21:13 发布