c语言实现迪杰斯特拉算法(邻接表)
储存结构,结构体的定义:(权值w用于表示两点间路径的花费)
typedef int Status;
typedef struct ENode//图的邻接表定义
{
int adjVex;//任意顶点u相邻接的顶点
int w;//边的权值
struct ENode* nextArc;//指向下一个边结点
}ENode;
typedef struct LGraph
{
int n;//图的当前顶点数
int e;//图的当前边数
ENode **a;//指向一维指针数组
}LGraph;
迪杰斯特拉算法:
int Choose(int *d, int *s,int n) //每次选择一个为加入数组s【】的具有最小权值的结点
{
int i,minpos,min;
min=INFTY;
minpos=-;
for(i=;i<n;i++)
{
if(d[i]<min&&!s[i])
{
min=d[i];
minpos=i;
}
}
return minpos;
}
Status Dijkstra(int v,int *d,int *path,LGraph *lg)//迪杰斯特拉算法求路径
{
int i,j,k,w;
ENode *p;
p=lg->a[v];//工作指针
int *s; if(v<||v>lg->n-)
{
return ERROR;
} s=(int*)malloc(sizeof(int)*lg->n);
for(i=;i<lg->n ;i++)
{
s[i]=;
path[i]=-;
d[i]=INFTY;
} while(p)//初始化
{
d[p->adjVex ]=p->w ;
if(p->adjVex!=v&&d[p->adjVex ]<INFTY)
{
path[p->adjVex ]=v;
}
p=p->nextArc ;
} //对各个数组初始化
s[v]=;
d[v]=;
for(i=;i<lg->n ;i++)
{ k=Choose(d,s,lg->n );
if(k==-)
{
continue;
} //判断是否选择了有效结点
s[k]=;
p=lg->a[k];
if(p==NULL)
{
continue ;
}
while(p)
{
if(!s[p->adjVex ]&&d[k]+p->w <d[p->adjVex ])//更新d和path
{
d[p->adjVex ]=d[k]+p->w ;
path[p->adjVex ]=k;
}
p=p->nextArc ;
}
}
return OK;
}
void fun(LGraph *lg)//此函数用于输出路径
{
int v,u;
printf("please input u and v:\n");
scanf("%d %d",&u,&v);
int d[lg->n];
int path[lg->n];
Dijkstra(u,d,path,lg);
printf("path: ");
if(path[v]==-)
{
printf("无\n");
return ;
}
while (path[v]!=-)
{
printf("%d <--- ",v);
v=path[v];
}
printf("%d\n",u);
}
c语言实现迪杰斯特拉算法(邻接表)的更多相关文章
- hdu 1548 A strange lift(迪杰斯特拉,邻接表)
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 迪杰斯特拉算法c语言实现
/*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法 P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode
迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
随机推荐
- codeforces_738D
D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- CAD插入非等比例的图块
主要用到函数说明: _DMxDrawX::InsertBlock 向控件数据库中插入一个图块,不用它插入匿名块.详细说明如下: 参数 说明 BSTR pszDwgFileName 图块定义的dwg 文 ...
- Django - 一对多跨表操作
1.views.py 2.host.html 运行结果: 通过外键,来进行多表取值(多表取值包括后台取值及前端获取): 多表获取数据时,可以通过以下几种方式实现: 1.从query set 中获取某 ...
- / Vijos / 题库 / 1622 / 文件查找(HOI)
/ Vijos / 题库 /1622/文件查找(HOI) 描述 WINDOWS是一个很庞大的操作系统(当然啦,看占的硬盘空间就知道了),比如说,它的文件查找系统.现在,请你用PASCAL或者C或者C+ ...
- 基于Arduino的音乐动感节奏灯
1.音乐动感节奏灯是个什么东西? 前段时间听音乐觉得无聊,便想着音乐光听也没意思啊,能不能 “看见” 音乐呢?于是谷歌了一番,发现还真有人做了将音乐可视化的东西,那就是音乐节奏灯.说的简单点就是LED ...
- jquery源码分析(七)——事件模块 event(二)
上一章节探讨了事件的一些概念,接下来看下jQuery的事件模块. jQuery对事件的绑定分别有几个API:.bind()/.live()/.delegate()/.on()/click(), 不管是 ...
- 【POJ 1981】Circle and Points(已知圆上两点求圆心坐标)
[题目链接]:http://poj.org/problem?id=1981 [题意] 给你n个点(n<=300); 然后给你一个半径R: 让你在平面上找一个半径为R的圆; 这里R=1 使得这个圆 ...
- noip模拟赛 三部曲
分析:子树上操作,要用到线段树+dfs序,关键就是子树内k还要增加,这个就不是很好办.可以求出在根节点+0后每个点会加多少,记为d[i],如果要对点x进行A操作,实际上只需要对子树加k - d[i]再 ...
- [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...
- Flume安装部署
Flume安装部署 Flume的安装(非常简单) 上传安装包到数据源所在节点上,实际上不是数据源节点也是可以的,只要运行Flume的这台机器与数据源节点的这台机器能够通过某种协议进行通信即可. 然后解 ...