迪杰斯特拉求解各参量变化

#include <stdio.h>
#include <stdlib.h> 
#define MAXVEX 9
#define INFINITY 32767
 
typedef int Patharc[MAXVEX];  //存放最短路径上的结点编号
typedef int ShortPathTable[MAXVEX]; //各节点到源点的路径(经过中间结点)长度
 
struct MGraph{
	int numVertexes;
	int *vex;
	int arc[MAXVEX][MAXVEX];
};
 void ShortestPath_Dijkstra(MGraph *G,int v0,int vv,Patharc *P,ShortPathTable *D)
{
	int v,w,k,min,t;
	int result[MAXVEX];
	int n=0;
	t=G->numVertexes*G->numVertexes;
	int i,j,cc[t];//cc为临时贮存 
	for(i=0;i<t;i++)
	cc[i]=777;
 	i=0;
	for(v=0;v<G->numVertexes;++v)
	{
		result[v]=0;
		(*D)[v]=G->arc[v0][v];  //初始化,其余各节点到源点的距离
		if((*D)[v]<INFINITY)(*P)[v]=v0;
		else
		(*P)[v]=-1;
	}
	(*D)[v0]=0;//源点到原点的距离 
	result[v0]=1; //源点加入
	
    printf(" w   min   (*D)[w]\n");
    printf("________________\n");
	for(v=0;v<G->numVertexes;++v)
	{
		min=INFINITY;
	
	
		for(w=0;w<G->numVertexes;++w) //寻找未加入的所有结点中到源点距离最短的结点k
		{
			if(!result[w] && (*D)[w]<min)
			{
				k=w;
				min=(*D)[w];
				printf("v%d%6d%8d\n",w,min,(*D)[w]);
				cc[i++]=(*D)[w];
				
				
			}
			else
			{
			printf("v%d%6d%8d\n",w,min,(*D)[w]);
			cc[i++]=(*D)[w];
			}
		}
		result[k]=1; //结点k加入
	

		printf("_ _ _ _ _ _ _ _ _\n");
 
		for(w=0;w<G->numVertexes;++w) //更新其余各节点到源点的距离的距离数组
		{
			if(!result[w] && (min+G->arc[k][w]<(*D)[w])) //新节点w到源点的距离=k到源点的距离+k到w的距离
			
			{
				(*D)[w]=min+G->arc[k][w];
				
				(*P)[w]=k;
			}
		}}	

	
	
//输出结果
	
	printf("终点 ");
    for(i=0;i<G->numVertexes;i++)
    printf("     i=%d",i+1);
    for(i=0;i<G->numVertexes;i++){
	printf("\n");
	printf("v%d  ",i+1);
	for(j=0;j<G->numVertexes;j++)
	if(cc[j*G->numVertexes+i]==INFINITY)
	printf("      ∞");
	else
	printf("%8d",cc[j*G->numVertexes+i]);
	}
	printf("\n");
	for(v=0;v<G->numVertexes;++v)
	{
		printf("Path[%d]=%d  ",v,(*P)[v]);
	}
	printf("\n");
	}	

 
int main()  
{  
    MGraph *my_g=(struct MGraph*)malloc(sizeof(struct MGraph));  
    int i,j;  
    int t=0;
 
	int v0=0;
	int vv=5;
 
    my_g->numVertexes=6;  
    my_g->vex=(int*)malloc(sizeof(char)*my_g->numVertexes); 
    if(!my_g->vex) return 0;  
    for(i=0;i<my_g->numVertexes;++i){  //一维数组(图中各结点)初始化
        my_g->vex[i]=i;
	}
 
    for(i=0;i<my_g->numVertexes;++i)  
        for(j=0;j<my_g->numVertexes;++j)  
            my_g->arc[i][j]=INFINITY;
 

my_g->arc[0][2]=10;  my_g->arc[0][4]=30; my_g->arc[0][5]=100;
    my_g->arc[1][2]=5;  
    my_g->arc[2][3]=50;
    my_g->arc[3][5]=10; 
	my_g->arc[4][3]=20;  my_g->arc[4][5]=60; 
	
      
    for(i=0;i<my_g->numVertexes;++i)  //二维数组表示图中各结点间连接边的weight  
    {  
        for(j=0;j<my_g->numVertexes;++j)  
            printf("%5d  ",my_g->arc[i][j]);  
        printf("\n");  
    }  
    printf("\n\n");
 
 
	Patharc P;
	ShortPathTable D;
	ShortestPath_Dijkstra(my_g,v0,vv,&P,&D);
 	free(my_g->vex);
}

输入的图
输入的图
输出的表
迪杰斯特拉求解各参量变化表
结果在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值