初学者 按照自己的理解写的
#include <stdio.h> #include <stdlib.h> #define MAX 1000 void Dijkstra(int arc[][5],int arcnum,int vertexnum); int min(int *dist,int n); int main(int argc, char *argv[]) { int arc[5][5]={{0,10,MAX,30,100},{MAX,0,50,MAX,MAX},{MAX,MAX,0,MAX,10},{MAX,MAX,20,0,60},{MAX,MAX,MAX,MAX,0}};//输入一个图的邻接矩阵// int v=0;//求源点到个点之间的最短路,这里假设源点0;也可以是点1,点2 点n int vertexnum=5;//定点的个数 Dijkstra(arc,v,vertexnum); return 0; } // Dijkstra算法 求源点到各点之间的最短路 与bfs的思路有些相似 void Dijkstra(int arc[][5],int v,int vertexnum) { int k,num,i,dist[2000]; for(i=0;i<vertexnum;i++){ dist[i]=arc[v][i]; } for(num=1;num<vertexnum;num++) {//有多少顶点就循环 就循环vertexnum-1次 k=min(dist,vertexnum); printf("%d %d\n",dist[k],k);//输出v点到k点的最短路 for(i=0;i<vertexnum;i++)// 修改数组dist if(dist[i]>dist[k]+arc[k][i]) dist[i]=dist[k]+arc[k][i]; dist[k]=0;// 将访问过的顶点标记,在下次循环中不参与比较 }} //求dist集合中最短的路 int min(int *dist,int n){ int k,m,i; k=1001; for(i=0;i<n;i++) if(dist[i]!=0) if(dist[i]<k) {k=dist[i]; m=i;} return m; }