有权图的单源最短路径算法C语言

  • 基本框架
    在这里插入图片描述
  • 代码实现
    以下图为例,结点是0,1,2,3,4,5,6
    在这里插入图片描述
#include <stdio.h>
#include <stdlib.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define ElementType int
#define MAXSIZE 10
#define MAX 11111
typedef struct GraphNode
{
	ElementType data;
	struct GraphNode* next;
}Graph;
int node_num;
int path[MAXSIZE];
int edge[MAXSIZE][MAXSIZE]={0};
int dist[MAXSIZE];
int collected[MAXSIZE];
void Dijkstra(Graph* G)
{
	dist[0]=0;
	while(1)
	{
		int min=11112;
		int v=-1;
		for(int i=0;i<node_num;i++)
		{
			if(dist[i]<min && collected[i]==0)
			{
				min=dist[i];
				v=i;	
			}
		}
		if(v==-1)	return;
		collected[v]=1;
		Graph* t=&G[v];
		while(t->next)
		{
			int w=t->next->data;
			if(collected[w]==0 && dist[v]+edge[v][w]<dist[w])
			{
				dist[w]=dist[v]+edge[v][w];
				path[w]=v;
			}
			t=t->next;
		}
		
	}
}
int main(int argc, char** argv) {
	
	Graph* G=(Graph*)malloc(MAXSIZE*sizeof(GraphNode));
	int edge_num;
	scanf("%d %d",&node_num,&edge_num);
	
	for(int i=0;i<node_num;i++)
	{
		dist[i]=MAX;
		path[i]=-1;
		collected[i]=0;
		G[i].data=i;
		G[i].next=NULL;
	}
	for(int i=0;i<edge_num;i++)
	{
			
		int start,end,value;
		scanf("%d %d %d",&start,&end,&value);
		Graph* newG=(Graph*)malloc(sizeof(GraphNode));
		newG->data=end;
		newG->next=G[start].next;
		G[start].next=newG;
		edge[start][end]=value;
		
	}
	Dijkstra(G);
	printf("**************\n");
	//找出第0个结点到其他结点的路径
	for(int i=1;i<node_num;i++)
	{
		int location=i;
		while(location!=-1)
		{
			printf("%d ",location);
			location=path[location];
		}
		printf("\n");
	} 
	return 0;
}
/*
输入数据:
7 12
0 1 2
0 3 1
1 3 3
1 4 10
2 0 4
2 5 5
3 2 2
3 5 8
3 6 4
3 4 2
4 6 6
6 5 1
*/

  • 结果
    在这里插入图片描述
    解释一下这个结果:每一行都反着看
    第1行是第结点0到结点1的最短路径:0–>1
    第2行是第结点0到结点2的最短路径:0–>3–>2
    第3行是第结点0到结点3的最短路径:0–>3
    第4行是第结点0到结点4的最短路径:0–>3–>4

    当然大家也可以把结果弄成正常到,把结果一个个压入栈,出栈的顺序就是正常最短路径顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值