[基本思想]

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

迪杰斯特拉算法(邻接表求解)相关推荐

  1. dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 迪杰斯特拉算法(朴素) O(n^2) G={V,E} V:点集合 E:边集合 初始化时 令 S={某源点ear}, T=V-S= {其余顶点},T中顶点对应的距离(ear, Vi)值若 ...

  2. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  3. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言)

    图的邻接表实现迪杰斯特拉算法(C语言). 迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题. 图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是 ...

  4. 迪杰斯特拉算法---求解最短路径

    迪杰斯特拉算法: 按路径长度递增的次序求解最短路径的方法.从单源点出发查找与单源点连接的最小的边,把该边对应的顶点加入集合V,然后从该顶点开始与原来到其他各顶点的最短路径进行比较,若比原来的路径小,则 ...

  5. 4012最长的最短路径的求解(C++,迪杰斯特拉算法,注释全,附迪杰斯特拉算法详解文章)

    描述 设计一个算法,求图G中距离顶点v的最短路径长度最大的一个顶点. 输入 多组数据,每组数据m+2行.每组数据第一行为两个整数n和m,代表有n个顶点m条路.顶点编号为1到n.第二行到第m+1行每行有 ...

  6. Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径

    文章目录 (一).题目 (二).导库 (三).绘制带权无向图 (四).获得最短路径 (四).实现最短路径高亮 (五).完整代码 (六).结果展示 关于Python数据分析在数学建模中的更多相关应用:P ...

  7. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

  8. 别说了,世界那么大我想去看看!(最短路径-迪杰斯特拉算法弗洛伊德算法)

    前言: 一直想去外面的世界看看,中国城市那么多,那么美,怎么样才可以用最少的钱,最短的时间游遍我想去的城市呢?(我在做梦?不不不!迪杰斯特拉算法和弗洛伊德算法来了)      这两个算法有着广泛的用途 ...

  9. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

最新文章

  1. 一劳永逸,iOS 网页视图控制器通用类封装
  2. Cisco的相关配置
  3. python官方网站地址-哪里能找到 Python 视频教程地址?
  4. UVa 1025 A Spy in the Metro
  5. Facebook Architecture @ QCon Next Month: Infrastructure, HTML5, NoSQL, OO Design
  6. python怎么更新数据库_在Python的Django框架中更新数据库数据的方法
  7. 发送json给服务器
  8. codeforces 706B B. Interesting drink(二分)
  9. YY:马化腾的大漏招
  10. L1-024 后天 (5 分) — 团体程序设计天梯赛
  11. 怎样下载企业通讯录Excel模板
  12. 西门子uss通讯实例_西门子USS通信调试经历
  13. 正确的座机号码格式_简历里的手机号及座机号的标准写法是什么?正确书写才更可能求职成功!...
  14. c语言开发gc,GC的基本原理
  15. 博客总纲 博客目录V1
  16. NTL密码算法开源库-大整数ZZ类(三)
  17. 用python写一个PDF翻译软件
  18. 区块链学习6:图灵完备和图灵不完备
  19. uni-app 最简单的显示隐藏
  20. 怎样找对还有一半---第四章认识彼此 完全接纳

热门文章

  1. LabVIEW学习(一):认识LabVIEW
  2. 远程云服务器闪退_远程服务器连接 闪退
  3. python中def _init_是什么意思_python3类中的def __init()__如何使用?
  4. R mean() 函数 - 计算平均值
  5. C#根据工作经验来谈谈面向对象
  6. 塔塔露也能学会的算法(2) | 我有背包你有手么
  7. 对待二手车过户要理性
  8. 李宏毅老师《机器学习》课程笔记-6 GAN
  9. ROS启动失败的一个ip错误坑
  10. ubuntu 16.04 14.04 安装各种软件