Dijkstra算法的C语言实现 matlab将邻接矩阵生成有向图

本文探讨了图论中的Dijkstra算法,并使用MATLAB进行实现与可视化。通过邻接矩阵表示图结构,展示了如何寻找两点间的最短路径。代码中包含了图的创建、权重显示及径路展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

close all,clear,clc;

cm =[ 

     0     4     6     6     0     0     0;

     0     0      1     0      7     0     0;

     0    0      0     0      6     4     0;

     0     0      2     0      0     5     0;

     0     0      0    0      0     0     6;

     0     0      0     0     1    0     8;

     0     0      0     0      0    0    0;

     ];

 IDS={'A','B','C','D','E','F','G'};

 bg=biograph(cm,IDS);

 set(bg.nodes,'shape','circle','color',[1,1,1],'lineColor',[0,0,0]);

 set(bg,'layoutType','radial');

 bg.showWeights='on';

 set(bg.nodes,'textColor',[0,0,0],'lineWidth',2,'fontsize',9);

 set(bg,'arrowSize',12,'edgeFontSize',9);

 get(bg.nodes,'position')

 view(bg);

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define NUM 7
 
typedef struct MGraph		/* 邻接表存储结构 */
{
     int edges[NUM][NUM];
     int n,e;
} MGraph;
 
MGraph *build_mgraph();
void Dijkstra(MGraph *mgraph, int v);
void Dispath(int dis[],int pre[],int visited[], int n, int v);
void Ppath(int path[], int i, int v);
 
int main(void)
{
     MGraph *mgraph;
 
     printf("\n*************************************************************\n");
     printf("该图的矩阵表示为:\n");
     mgraph=build_mgraph();
     printf("\n*************************************************************\n");
     printf("dijkstra 算法:\n");
     Dijkstra(mgraph,0);
     printf("\n*************************************************************\n");
     
     return 0;
}
 
MGraph *build_mgraph()
{
     int i,j;
     int num_e=0;
     MGraph *mgraph=(MGraph *)malloc(sizeof(MGraph));
     int matrix[NUM][NUM]={{0,4,6,6,INT_MAX,INT_MAX,INT_MAX},
			   {INT_MAX,0,1,INT_MAX,7,INT_MAX,INT_MAX},
			   {INT_MAX,INT_MAX,0,INT_MAX,6,4,INT_MAX},
			   {INT_MAX,INT_MAX,2,0,INT_MAX,5,INT_MAX},
			   {INT_MAX,INT_MAX,INT_MAX,INT_MAX,0,INT_MAX,6},
			   {INT_MAX,INT_MAX,INT_MAX,INT_MAX,1,0,8},
			   {INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,0}};
     for(i=0;i<NUM;i++)
     {
	  for(j=0;j<NUM;j++)
	  {
	       mgraph->edges[i][j]=matrix[i][j];
	       if(matrix[i][j]!=0 && matrix[i][j]!=INT_MAX)
		    num_e++;
	  }
     }
     mgraph->n=NUM;
     mgraph->e=num_e;
 
     printf("node=%d;edges=%d\n",mgraph->n,mgraph->e);
     for(i=0;i<NUM;i++)
     {
	  for(j=0;j<NUM;j++)
	  {
	       if(mgraph->edges[i][j]!=INT_MAX)
		    printf("%3d",mgraph->edges[i][j]);
	       else
		    printf("%3c",'&');
	  }
	  printf("\n");
     }
 
     return mgraph;
}
 
void Dijkstra(MGraph *mgraph, int v)
{
     int i,j;
     int no;
     int min_dis;
     int dis[NUM];
     int visited[NUM]={0};
     int pre[NUM];
 
     visited[v]=1;
     for(i=0;i<mgraph->n;i++)
     {
	  dis[i]=mgraph->edges[v][i];
	  pre[i]=v;
     }
     
     for(i=0;i<mgraph->n;i++)
     {
	  min_dis=INT_MAX;
	  for(j=0;j<mgraph->n;j++)
	  {
	       if(!visited[j] && dis[j]<min_dis)
	       {
		    min_dis=dis[j];
		    no=j;
	       }
	  }
	  visited[no]=1;
	  for(j=0;j<mgraph->n;j++)
	  {
	       if(!visited[j] && mgraph->edges[no][j]!=INT_MAX && dis[no]+mgraph->edges[no][j] < dis[j])
	       {
		    dis[j]=dis[no]+mgraph->edges[no][j];
		    pre[j]=no;
	       }
	  }
     }
     
     Dispath(dis,pre,visited,mgraph->n,v);
}
 
void Dispath(int dis[],int pre[],int visited[], int n, int v)
{
     int i;
     for(i=0;i<n;i++)
     {
	  if(visited[i])
	  {
	       printf("从%d到%d的最短路径长度为:%d\t路径为:",v,i,dis[i]);
	       printf("%d, ",v);
	       Ppath(pre,i,v);
	       printf("%d\n",i);
	  }
	  else
	       printf("no path\n");
     }
}
void Ppath(int pre[], int i, int v)
{
     int k;
     k=pre[i];
     if(k==v)
	  return;
     Ppath(pre,k,v);
     printf("%d, ",k);
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值