Description
给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。
Input
先输入一个小于等于100的正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大,并且任意一条简单路径的长度都小于10000)
Output
按结点编号的顺序输出0号结点所有结点的最短路径的长度。
-
Sample Input
6 0 1 4 10000 10000 10000 1 0 2 7 5 10000 4 2 0 10000 1 10000 10000 7 10000 0 3 2 10000 5 1 3 0 6 10000 10000 10000 2 6 0
-
Sample Output
0 1 3 7 4 9
#include <stdio.h>
#include <stdlib.h>
#define maxnum 130
#define maxint 10000
void Dijkstra(int n, int v, int *dist, int *prev,int matrix[maxnum][maxnum])
{
bool visited[maxnum];
int i, j;
for(i = 1; i <= n; i ++)
{
dist[i] = matrix[v][i];
visited[i] = 0;
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
visited[v] = 1;
for(i = 2; i <= n; i++)
{
int temp = maxint;
int u = v;
for(j = 1; j <= n; j ++)
{
if((visited[j]==0) && (dist[j]<temp))
{
u = j;
temp = dist[j];
}
}
visited[u] = 1;
for(j = 1; j <= n; j++)
{
if((visited[j]==0) && (matrix[u][j]<maxint))
{
int newdist = dist[u]+matrix[u][j];
if(newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
int main()
{
int dist[maxnum];
int prev[maxnum];
int matrix[maxnum][maxnum];
int n;
scanf("%d",&n);
int i, j;
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
{
scanf("%d",&matrix[i][j]);
}
}
Dijkstra(n, 1, dist, prev, matrix);
for(i = 1; i <= n; i++)
printf("%d\n", dist[i]);
}
基本就是在套用Dijkstra算法的模板~模板真好用
显示的时候貌似有些问题,直接忽略就好……因为我也不知道为什么会出现这种问题QAQ