`
datoplay
  • 浏览: 1614931 次
文章分类
社区版块
存档分类
最新评论

单源最短路径Dijkstra算法C++实现

 
阅读更多

// 单源最短路径Dijkstra算法实现.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#define MAX 200
#define Infinity 65535
using namespace std;

//边尾节点信息结构体
struct edgeNode
{
int no; //尾接点序号
int cost; //边权值
edgeNode *next; //其下一条邻接边尾节点指针
};

//节点信息结构体
struct vexNode
{
char info; //节点名称
edgeNode *link; //与其相连的边的尾节点链表指针
};

struct Queue
{
int no; //队列中节点序号
int cost; //以此为尾节点的边的权值
};

//优先队列
Queue priQue[MAX];
//节点数组
vexNode adjlist[MAX];
//指定源点到节点i的最短路径花费
int lowcost[MAX];
//指定源点到节点i路径中,节点i的前驱节点序号
int parent[MAX];

//建立图邻接表
void createGraph(vexNode *adjlist,int *parent,int * lowcost,const int n,const int e)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"请输入节点"<<i<<"的名称:";
cin>>adjlist[i].info;
adjlist[i].link = NULL;
lowcost[i] = Infinity;
parent[i] = i;
}
edgeNode *p1;
int v1,v2;
for(i=1;i<=e;i++)
{
cout<<"请输入边"<<i<<"的起始节点与尾节点序号:";
cin>>v1>>v2;
p1 = (edgeNode*)malloc(sizeof(edgeNode));
p1->no = v2;
cout<<"此边的权值:";
cin>>p1->cost;
p1->next = adjlist[v1].link;
adjlist[v1].link = p1;
}
}
//当插入节点到优先队列时,保持队列优先性
void keep_min_heap(Queue *priQue,int &num,const int k)
{
int l = 2*k;
int r = 2*k + 1;
int smallest = k;
if(l<=num&&priQue[l].cost<priQue[k].cost)
smallest = l;
if(r<=num&&priQue[r].cost<priQue[smallest].cost)
smallest = r;
if(smallest != k)
{
Queue temp = priQue[smallest];
priQue[smallest] = priQue[k];
priQue[k] = temp;
keep_min_heap(priQue,num,smallest);
}
}

//插入节点到优先队列时并且保持队列优先性
void heap_insert(Queue *priQue,int &num,int no,int cost)
{
num +=1;
priQue[num].no = no;
priQue[num].cost = cost;
int i = num;
while(i>1&&priQue[i/2].cost>priQue[i].cost)
{
Queue temp = priQue[i];
priQue[i] = priQue[i/2];
priQue[i/2] = temp;
i = i/2;
}
}
//取出优先队列的队头元素
Queue heap_extract_min(Queue *priQue,int &num)
{
if(num<1)
return priQue[0];
Queue min = priQue[1];
priQue[1] = priQue[num];
num -=1;
keep_min_heap(priQue,num,1);
return min;
}

//打印指定源点带序号为i的点的最短路径
void print_it(int *parent,vexNode *adjlist,int v)
{
if(parent[v] == v)
cout<<"("<<v<<":"<<adjlist[v].info<<") ";
else
{
print_it(parent,adjlist,parent[v]);
cout<<"("<<v<<":"<<adjlist[v].info<<") ";
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例的个数:";
cin>>cases;
while(cases--)
{
int n,e;
cout<<"请输入节点数:";
cin>>n;
cout<<"请输入边数:";
cin>>e;
//队列中的元素,初始为0
int num = 0;
int i;
//创建邻接表
createGraph(adjlist,parent,lowcost,n,e);
cout<<endl;
cout<<"从哪个节点开始:";
int v0;
cin>>v0;
int v =v0;
lowcost[v0] = 0;
cout<<endl;
Queue queue;

for(i=1;i<n;i++)
{
edgeNode *p = adjlist[v0].link;
while(p != NULL)
{

if(lowcost[v0] + p->cost<lowcost[p->no])
{
lowcost[p->no] = lowcost[v0] + p->cost;
parent[p->no] = v0;
heap_insert(priQue,num,p->no,lowcost[p->no]);
}
p = p->next;
}
queue = heap_extract_min(priQue,num);
v0 = queue.no;
}
for(i=1;i<=n;i++)
{
mincost = 0;
cout<<"从点"<<adjlist[v].info<<"开始到"<<adjlist[i].info<<"的最短路径为:"<<endl;
print_it(parent,adjlist,i);
cout<<endl;
cout<<"距离为:"<<lowcost[i]<<endl;
}
}
system("pause");
return 0;
}

--------------------------------------------------程序测试-----------------------------------------------------

请输入案例的个数:1
请输入节点数:5
请输入边数:10
请输入节点1的名称:a
请输入节点2的名称:b
请输入节点3的名称:c
请输入节点4的名称:d
请输入节点5的名称:e
请输入边1的起始节点与尾节点序号:1 2
此边的权值:10
请输入边2的起始节点与尾节点序号:1 4
此边的权值:5
请输入边3的起始节点与尾节点序号:2 3
此边的权值:1
请输入边4的起始节点与尾节点序号:2 4
此边的权值:2
请输入边5的起始节点与尾节点序号:3 5
此边的权值:4
请输入边6的起始节点与尾节点序号:4 2
此边的权值:3
请输入边7的起始节点与尾节点序号:4 3
此边的权值:9
请输入边8的起始节点与尾节点序号:4 5
此边的权值:2
请输入边9的起始节点与尾节点序号:5 1
此边的权值:7
请输入边10的起始节点与尾节点序号:5 3
此边的权值:6

从哪个节点开始:1

从点a开始到a的最短路径为:
(1:a)
距离为:0
从点a开始到b的最短路径为:
(1:a) (4:d) (2:b)
距离为:8
从点a开始到c的最短路径为:
(1:a) (4:d) (2:b) (3:c)
距离为:9
从点a开始到d的最短路径为:
(1:a) (4:d)
距离为:5
从点a开始到e的最短路径为:
(1:a) (4:d) (5:e)
距离为:7
请按任意键继续. . .

分享到:
评论

相关推荐

    最短路径 Dijkstra算法C语言实现

    本设计以VC++6.0作为程序开发环境,C语言作为程序开发语言,详细介绍了最短路径的求解算法及其...请用C/C++语言的结构体、指针、数据结构等基础知识,编写程序实现图的结构定义、图的存储,以及求解单源点最短路径。

    贪心算法 Dijkstra 单源最短路径

    用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助

    图论算法库 C++ 语言实现 代码内容 图论算法库,包括以下算法: 单源最短路径 Dijkstra 算法 单源最短路径 Bell

    图论算法库 C++ 语言实现 代码内容 图论算法库,包括以下算法: 单源最短路径 Dijkstra 算法 单源最短路径 Bellman-Ford 算法 最小生成树 Prim 算法 每对节点间最短路径 Flod-Warshall 算法

    Dijkstra单源最短路径代码 C/C++实现

    DIJKSTRA单源最短路径算法C/C++实现,内有注释,输入邻接矩阵,输入源点到终点最短路径长度。

    aa.zip_C++ 图论的库_bellman_starfish_单源最短路径_图论最小路径

    图论算法库 C++ 语言实现 代码内容 图论算法库,包括以下算法: 单源最短路径 Dijkstra 算法 单源最短路径 Bellman-Ford 算法 最小生成树 Prim 算法 每对节点间最短路径 Flod-Warshall 算法 语言 C++ 编译平台 ...

    基于Dijkstra算法的最短路径实现与应用

    我们先阐述Dijkstra算法的原理,在算法设计中,分别用邻接矩阵和邻接表存储带权有向图,并编写C++语言实现Dijkstra算法最短路径,用户只需输入要处理的有向图中包含段的个数和弧头与弧尾的顶点以及该弧上所附带的...

    求单元最短路径

    综合运用C++编程技术和Dijkstra算法和Floyd算法,用VS2010或QT设计实现一个简单的城市之间最短路径管理软件,该软件能够模拟实现简单的路径维护、求解单源最短路径、求解所有节点间最短路径等功能。

    基于C++的Dijkstra算法的最短路径问题求解.zip

    Dijkstra算法是很有代表性的最短路径算法,通过应用Dijkstra算法使复杂问题更加简单化。算法是以起始点为中心向外层层扩展,直到扩展到终点为止,最终求出最短路径。采用Visual C++ 6.0的控制台工程和MFC工程分别...

    Dijkstra算法C++代码实现(含测试用例)

    Dijkstra算法的C++代码实现(运行正确,含测试用例,注释详细。) Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。pred[] 记录前驱结点,count记录已经找到最短路径...

    图论算法库 C++ 语言实现.zip_C++图论_C++图论的库_c++ 图论库_starfish_图论最优路径

    单源最短路径 Dijkstra 算法 单源最短路径 Bellman-Ford 算法 最小生成树 Prim 算法 每对节点间最短路径 Flod-Warshall 算法 语言 C++ 编译平台 VisualAge C++ 4.0 作者 starfish (starfish.h@china.com) 备注...

    最短路径经典数据结构算法-dijkstra

    dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。 本代码使用了有向图,数据为整数int,数据结构...

    C++计算任意权值的单源最短路径(Bellman-Ford)

    本文实例为大家分享了C++计算任意权值单源最短路径的具体代码,供大家参考,具体内容如下 一、有Dijkstra算法求最短路径了,为什么还要用Bellman-Ford算法 Dijkstra算法不适合用于带有负权值的有向图。 如下图: 用...

    城市之间最短路径管理软件

    综合运用了C++编程技术和Dijkstra算法和Floyd算法,用VS2010设计实现一个简单的城市之间最短路径管理软件,该软件能够模拟实现简单的路径维护、求解单源最短路径、求解所有节点间最短路径等功能。

    堆优化dijkstra.cpp

    Dijkstra算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为...

    dijkstra和spfa

    dijkstra和spfa用c++的实现,实现了求单源最短路径的算法

    dijkstra算法实现C++

    dijkstra算法实现C++

    GPS寻找最短路径程序

    鉴于要实现以上功能其核心的操作应是如何寻找出两城市之间的最短路径,可以采用改进的单源点寻找路径方法,即Dijkstra算法,并用邻接矩阵来存储地图,鉴于会有加入新城市的功能所以需要将初始的网络图设计的大一些,...

    c++ Dijkstra算法介绍

    迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

    图算法(c++模板)

    用c++模板写的图算法,包括广搜、深搜、最小生成树算法(prim、kruskal)、单源最短路径(bellman-ford、dijkstra)、拓扑排序,prim、dijkstra算法使用优先级队列实现

    图的Dijkstra算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于...Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

Global site tag (gtag.js) - Google Analytics