Dijkstra算法(最短路径问题)

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;
			}
		}

	
	}
	
}


测试程序main函数

#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;
}

测试结果:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值