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