迪杰斯特拉算法(邻接表求解)_dijkstra算法 领接表_蔬菜不菜啊的博客-程序员宅基地

技术标签: 算法  c语言  考研算法  数据结构  

[基本思想]

  1. 与邻接矩阵表示的方法不同的是,在更新dis数组和path数组时,只需要把求u到j距离的g.edges[u][j]换成邻接表表示
  2. g.edges[u][j]表示u到j的距离,因此可以写一个getWeight(g, u, j)算法用于计算u到j的距离

[核心函数]

//获得边的权重
float getWeight(AGraph *G, int u, int j)
{
    
	ArcNode *p = G->adjlist[u].firstarc;
	while(p != NULL)
	{
    
		if(p->adjvex == j)
			return p->weight;
		p = p->nextarc;
	}
	return INF;
}

[数据]

在这里插入图片描述

8 13
0 1 6
0 3 1
0 5 50
1 3 11
1 2 43
1 4 6
2 7 8
3 4 12
4 2 38
4 6 24
5 4 1
5 6 12
6 7 20

[完整代码]

#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define maxSize 100
#define INF 99999

typedef struct ArcNode
{
    
	int weight;		//记录权值
	int adjvex;		//邻接点
	struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
    
	int data;
	ArcNode *firstarc;
}VNode;
typedef struct AGraph
{
    
	VNode adjlist[MAXVEX];
	int numNodes, numEdges;
}AGraph;

//创建图
void CreateGraph(AGraph *G)
{
    
	int i;
	int m, n, weight;

	FILE *fp = fopen("data.txt", "r");
	fscanf(fp, "%d %d", &G->numNodes, &G->numEdges);

	for(i = 0; i < G->numNodes;i++)
		G->adjlist[i].firstarc = NULL;

	for(i = 0; i < G->numEdges;i++)
	{
    
		fscanf(fp, "%d %d %d", &m, &n, &weight);
		ArcNode *pe = (ArcNode *)malloc(sizeof(ArcNode));
		pe->adjvex = n;
		pe->weight = weight;
		pe->nextarc = G->adjlist[m].firstarc;
		G->adjlist[m].firstarc = pe;

		//ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
		//p->adjvex = n;
		//p->weight = weight;
		//p->nextarc = G->adjlist[m].firstarc;
		//G->adjlist[m].firstarc = p;
	}

	fclose(fp);

}

//获得边的权重
float getWeight(AGraph *G, int u, int j)
{
    
	ArcNode *p = G->adjlist[u].firstarc;
	while(p != NULL)
	{
    
		if(p->adjvex == j)
			return p->weight;
		p = p->nextarc;
	}
	return INF;
}

//迪杰斯特拉算法
void Dijkstra(AGraph *G, int dist[], int path[], int v)
{
    
	int set[maxSize];
	int i, j, u, min;
	float weight;
	//给三个数组赋初值
	for(i = 0;i < G->numNodes; i++)
	{
    
		set[i] = 0;
		path[i] = -1;
		dist[i] = INF;
	}

	ArcNode *p = G->adjlist[v].firstarc;
	while(p != NULL)
	{
    
		dist[p->adjvex] = p->weight;
		path[p->adjvex] = v;
		p = p->nextarc;
	}
	path[v] = -1;
	set[v] = 1;
	dist[v] = 0;

	for(i = 0;i < G->numNodes - 1;i++)
	{
    
		min = INF;

		for(j=0;j < G->numNodes;j++)
		{
    
			if(set[j] == 0 && dist[j] < min)
			{
    
				min = dist[j];
				u = j;
			}
		}
		set[u] = 1;

		for(j=0;j < G->numNodes;j++)
		{
    
			float weight = getWeight(G, u, j);
			if(set[j] == 0 && dist[u] + weight < dist[j])
			{
    
				dist[j] = dist[u] + weight;
				path[j] = u;
			}
		}
	}
}

//输出路径
void print_path(int path[], int v1)
{
    
	if(path[v1]==-1)
		printf("%d ", v1);
	else
	{
    
		print_path(path, path[v1]);
		printf("%d ", v1);
	}
}

int main()
{
    
	AGraph *G = (AGraph *)malloc(sizeof(AGraph));
	int v, v1;

	CreateGraph(G);

	int *path = (int *)malloc(sizeof(int)*G->numNodes);
	int *dist = (int *)malloc(sizeof(int)*G->numNodes);

	printf("输入起始点: ");
	scanf("%d", &v);

	printf("输入终止点: ");
	scanf("%d", &v1);

	Dijkstra(G, dist, path, v);
	
	printf("最短路径为: ");
	print_path(path, v1);

	getchar();
	getchar();
	return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shushushu0000/article/details/109808230

智能推荐

idea提交项目到github相关错误-程序员宅基地

1、在Idea中,File-Settings-Version Control-git 中,设置git安装目录2、添加GitHub账号,File-Settings-Version Control-GitHub,添加账号密码,点击test,成功。3、点击cvs-import into version control-share project on github结果保错:Can’t f...

POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】_poj3020-程序员宅基地

链接:http://poj.org/problem?id=3020http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#problem/MAntenna PlacementTime Limit: 1000MS Memory Limit: 65536K_poj3020

孚能科技登陆科创板,全球电池阵营迎来新格局-程序员宅基地

宁德时代新能源科技股份有限公司成立于2011年,是国内率先具备国际竞争力的动力电池制造商之一,专注于新能源汽车动力电池系统、储能系统的研发、生产和销售,致力于为全球新能源应用提供一流解决方案,2018年6月11日,宁德时代新能源科技创业板上市。宁德时代电池宁德时代的发展可谓一路高歌,竞争对手已不断更换,2015年前主要沃特玛、比亚迪,2017年主要比亚迪、松下,2019年主要松下、比亚迪到今年LG、松下;2016锂电池出货量排名2019年中国锂电池出货量排名202...

Java中的四种引用学习(一) —— Understanding Weak References Blog-程序员宅基地

Some time ago I was interviewing candidates for a Senior Java Engineer position. Among the many questions I asked was "What can you tell me about weak references?" I wasn't expecting a detail...

python Word 表格转 Excel_to_excel(excelpath,index=false,header=false)-程序员宅基地

关注RPA请访问网站:www.i-search.com.cn学Python,用RPA,欢迎下载使用https://www.i-search.com.cn/?from=csdnword 转 excel 代码块分享:使用前需要手动安装一下 python-docx 注意不是直接安装 doxc,目前 docx 好像没兼容 py3x,步骤如下进入网址https://www.lfd.uci.edu/~gohlke/pythonlibs/CTRL+F 查找 python_doxc 下载 python_doc_to_excel(excelpath,index=false,header=false)

配置Oracle E-Business Suite Integrated SOA Gateway Release 12.1.2/12.1.3-程序员宅基地

3.3 配置Oracle E-Business Suite Integrated SOA Gateway Release 12.1.2 注意: 在多节点环境上配置Oracle E-Business Suite Integrated SOA Gateway Release 12.1.2以使单个实例的配置服务同步和转换到多节点的EBS上,参看文档1081100.1Configuring Or...

随便推点

实验 Android程序学习助手-程序员宅基地

设计内容制作一个学习助手,不仅可以帮助学生查询成绩,还能够帮老师查询班级所有同学成绩,某课 程的所有学生成绩,还能够帮学生进行查询课程的功能,既能够根据日期来查询哪一天学生的所有课程,还能够根据课程查询学生的所有课程,还可以查询第几周的课程,实现一个既能够帮助学生,又能够帮助老师的学习助手以下图是功能实现图和界面图设计流程图实现方法1.数据库和表的建立,及插入原始数据和其使用(本实验...

RLC协议简单理解1-RLC报文格式_rlc头格式_楚来客的博客-程序员宅基地

RLC协议简介RLC(Radio Link Control)在无线协议架构中属于数据面协议中的一部分,数据传输从基站到终端的过程中,一共要经历UDP/SCTP-->SDAP/RRC-->PDCP-->RLC-->MAC-->PHY。通常PDCP/RLC/MAC统称为L2,所以RLC在整个无线协议中,可以认为其是数据面L2协议的一部分。RLC层的主要功能RLC层作为L2数据面协议的一部分主要解决的功能是如下几个:分段重组,上层PDCP过来的数据包大小与业..._rlc头格式

【读书笔记】算法的乐趣_weisman2的博客-程序员宅基地

什么是算法《算法导论》:定义良好的计算过程,它取一个或一组值作为输入,并产生一个或一组值作为输出。《计算机程序设计艺术》:从一个步骤开始,按照既定的顺序执行完所有的步骤,最终结束(得到结果)-《数据结构与算法分析》:一系列的计算步骤,将输入数据转换成输出的结果。Knuth 总结了算法的四大特征确定性:算法的每个步骤都是明确的,对结果的预期也是确定的有穷性:算法步骤数量有限可行性:算法每一步都可以执行输入和输出:有输入和输出算法设计基础程序基本结构:顺序执行、循环执行、分支跳转_算法的乐趣

太多:)-程序员宅基地

Internet Information Services 6.0 Migration Toolhttp://www.microsoft.com/downloads/details.aspx?familyid=2aefc3e4-ce97-4f25-ace6-127f933a6cd2&amp;displaylang=enhttp://www.ftponline.com/reports/vsliv...

docker Bridge0_docker bridge0 inactive 怎么办-程序员宅基地

先创建两个busybox的containers test1和test2 docker network ls #查看docker的网络会发现有一个名为bridge的网络 它就相当于一个交换机 接下来查看bridge的详细信息 docker network inspect bridge的network id可以看到containers块 里面有test1 test..._docker bridge0 inactive 怎么办

Pentaho常见问题小结-程序员宅基地

Pentaho Q&amp;A List 下面链接为此文档的PDF格式:http://dl.iteye.com/topics/download/80c28022-bbf0-3b3a-9bb3-6dcc066b7135 作者:http://flyfoxs.iteye.com目录 1.柱状图(Bar Chart),和折线图(Line Ch...

推荐文章

热门文章

相关标签