Dijikstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。该算法是由荷兰计算机科学家迪杰斯特拉于1959年提出的。
程序来源:Dijkstra's Algorithm。
百度百科:Dijkstra算法。
维基百科:Dijkstra's Algorithm。
C语言程序(去除了原文中非标准的C语言代码):
#include<stdio.h> #define INFINITY 9999 #define MAX 10 void dijikstra(int G[MAX][MAX], int n, int startnode); int main(){ int G[MAX][MAX], i, j, n, u; printf(" Enter the no. of vertices:: "); scanf("%d", &n); printf(" Enter the adjacency matrix:: "); for(i=0;i < n;i++) for(j=0;j < n;j++) scanf("%d", &G[i][j]); printf(" Enter the starting node:: "); scanf("%d", &u); dijikstra(G,n,u); } void dijikstra(int G[MAX][MAX], int n, int startnode) { int cost[MAX][MAX], distance[MAX], pred[MAX]; int visited[MAX], count, mindistance, nextnode, i,j; for(i=0;i < n;i++) for(j=0;j < n;j++) if(G[i][j]==0) cost[i][j]=INFINITY; else cost[i][j]=G[i][j]; for(i=0;i< n;i++) { distance[i]=cost[startnode][i]; pred[i]=startnode; visited[i]=0; } distance[startnode]=0; visited[startnode]=1; count=1; while(count < n-1) { mindistance=INFINITY; for(i=0;i < n;i++) if(distance[i] < mindistance&&!visited[i]) { mindistance=distance[i]; nextnode=i; } visited[nextnode]=1; for(i=0;i < n;i++) if(!visited[i]) if(mindistance+cost[nextnode][i] < distance[i]) { distance[i]=mindistance+cost[nextnode][i]; pred[i]=nextnode; } count++; } for(i=0;i < n;i++) if(i!=startnode) { printf(" Distance of %d = %d", i, distance[i]); printf(" Path = %d", i); j=i; do { j=pred[j]; printf(" <-%d", j); } while(j!=startnode); } printf(" "); }
程序运行结果:
Enter the no. of vertices:: 4 Enter the adjacency matrix:: 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 Enter the starting node:: 1 Distance of 0 = 1 Path = 0 <-1 Distance of 2 = 1 Path = 2 <-1 Distance of 3 = 2 Path = 3 <-0 <-1