Dijkstra算法是解决从网络中任一点出发,求出他到各个定点的最短路径。任意两点间可以单向导通,权值也不一样,
用程序给出具体程序
如下:
头文件:
#define MGRAPH_H_
#define MAXN 64
#define M 1<<10
typedef struct
{
int vertex[MAXN];
int edge[MAXN][MAXN];
int n;
}mgraph;
typedef struct
{
int pi[MAXN];
int end;
}pathtype;
mgraph *mgraph_create(int n, int matrix[][n]);
void dijkstra(mgraph *mg, int v, int *dist, pathtype *path);
函数的主要实现文件:
#include <stdio.h>
#include <stdlib.h>
#include "mgraph.h"
mgraph *mgraph_create(int n, int matrix[][n])
{
int i, j;
mgraph *mg;
mg = (mgraph *)malloc(sizeof(mgraph));
if (mg == NULL)
return mg;
mg->n = n;
for (i = 0; i < n; i++)
{
mg->vertex[i] = i;
for (j = 0; j < n; j++)
mg->edge[i][j] = matrix[i][j];
}
return mg;
}
void dijkstra(mgraph *mg, int v, int *dist, pathtype *path)
{
int s[MAXN] = {0};
int i,j,m;
int tmp;
for(i=0;i<mg->n;i++)
{ dist[i]=mg->edge[v][i];
path[i].end=0;
path[i].pi[0]=v;
}
int count=mg->n-1;
while(count)
{
s[v]=1;
count--;
tmp =M;
for(i=0;i<mg->n;i++)
if(s[i]==0&&dist[i]<=tmp)
{ tmp=dist[i];j=i;}
s[j]=1;
printf("end is %d\n",path[j].end);
path[j].pi[++(path[j].end)]=j;
printf("after end is %d\n",path[j].end);
for(i=0;i<mg->n;i++)
if(s[i]==0&&(dist[i]>dist[j]+mg->edge[j][i]))
{
dist[i]=dist[j]+mg->edge[j][i];
for(m=0;m<=path[j].end;m++)
{
path[i].pi[m]=path[j].pi[m];
path[i].end=m;
}
}
}
}
#include <stdio.h>
#include <string.h>
#include "mgraph.h"
#define N 6
int main()
{
mgraph *mg;
int dist[N], i, j;
pathtype path[N];
bzero(path,sizeof(path));
int matrix[N][N]={
/* v0 v1 v2 v3 v4 v5 */
/*v0*/ {0, 20,15,M, M, M},
/*v1*/ {2, 0, 4, M, 10,30},
/*v2*/ {M, M, 0, M, M, 10},
/*v3*/ {M, M, M, 0, M, M},
/*v4*/ {M, M, M, 15,0, 10},
/*v5*/ {M, M, M, 4, M, 0}};
mg = mgraph_create(N, matrix);
dijkstra(mg, 0, dist, path);
for (i = 0; i < N; i++)
{
printf("L=%d ", dist[i]);
for (j = 0; j <= path[i].end;j++)
printf("V%d ", path[i].pi[j]);
printf("\n");
}
return 0;
}
测试结果: