#ifndef GUIDE_H_INCLUDED
#define GUIDE_H_INCLUDED
#define MX 1000 //最大值 无穷
#define NUM 6 //最大顶点个数
typedef int adjmatrix[NUM][NUM];
typedef int path[NUM][NUM];
typedef int Dist[NUM];//v0到vi的的距离
int ps[NUM]={0}; //最短路径值
int final[NUM];//final[i]=1代表已经求出v0到vi的最短路径
const int vexs[NUM] = {0,1,2,3,4,5};
int arcs[NUM][NUM] = {
{MX,MX,10,MX,30,100},
{MX,MX,5,MX,MX,MX},
{MX,MX,MX,50,MX,MX},
{MX,MX,MX,MX,MX,10},
{MX,MX,MX,20,MX,60},
{MX,MX,MX,MX,MX,MX}
};
#endif
#include <iostream>
using namespace std;
#include "guide.h"
//=====================================================
void ShorttestPath_DIJ(adjmatrix arc,int v,path &p,Dist &d)
{
//用迪杰斯特拉算法求解v0到其余个点的最短路径,p[v][w]代表v0到v经过w
int w=0;
for(int nv=0;nv<NUM;nv++)
{
final[nv]=0;
d[nv]=arc[v][nv];
ps[nv]=d[nv];
for(int w=0;w<NUM;w++) p[nv][w]=false;
if(d[nv]<MX)
{
p[nv][v]=1;
p[nv][nv]=1;
}
}//for
d[v]=0;
final[v]=1;
int min=MX;
//开始主循环
for(int i=1;i<NUM;++i)
{
min=MX;
for(w=0;w<NUM;++w)
{
if(final[w]==0)
{
if(d[w]<min)
{
v=w;
min=d[w];
}
}
}//for
final[v]=1;
for(w=0;w<NUM;w++)
{
if(final[w]==0&&(min+arc[v][w])<d[w])
{
d[w]=min+arc[v][w];
ps[w]=ps[v]+arc[v][w];
for(int pos=0;pos<NUM;pos++)
{
p[w][pos]=p[v][pos];//借助最短路径到达w点
}
p[w][w]=1;//经过w点
}//endif
}//for
}//for
}
void DIJ_Print(int start,path &P)
{
for(int i=1;i<NUM;i++)
{
int u=i;
if(final[i]==1)
{
cout<<"距离:"<<ps[i]<<"\t";
cout<<start;
int m=start;
for(int j=1;j<NUM;j++)
{
if( P[u][j]==1)
{
if(arcs[m][j]>0 && arcs[m][j]<MX)
{
cout<<"->"<<j;
m=j;
j=1;
}
}
}
cout<<endl;
}//endif
}//endfor
}
void ShortestPath()
{
int start = 5;
Dist D; //D[i]表示从start到i的最短距离;
path P; //P[i,j]表示从start到i的最短路径上会经过j
int t[NUM]={0};
int n=0;
cout << "输入出发点 (0~5 空格分隔)" << endl;
cin >> start;
if(start>=0 && start<6)
{
//调用迪杰斯特拉算法
ShorttestPath_DIJ(arcs,start,P,D);
cout <<"从"<< start;
cout << "到其他各点的最短路径长度 :"<<endl ;
//调用迪杰斯特拉打印算法
DIJ_Print(start,P);
}//endif
else
cout << "没有这个地方!" << endl;
}
//============== mian文件 =============
int main()
{
char choose=0;
cout << "************************" << endl;
cout << " a.x到其他点的最短路径 " << endl;
cout << " b.退出 " << endl;
cout << " 版本号v1.8 " << endl;
cout << "************************" << endl;
cin >> choose;
while( choose!='b' )
{
if( choose=='a' )
{
ShortestPath();
cout << "===========================" << endl;
cout << " a.x到y的最短路径 b.退出 " << endl;
cout << "===========================" << endl;
}
else if(choose!='a'||choose!='b') cout << "输入错误,请重新输入:";
cin >> choose;
}
return 0;
}
分享到:
相关推荐
(精品)迪杰斯特拉算法C语言实现【整理】.txt
在C语言中实现迪杰斯特拉算法,需要理解以下几个关键知识点: 1. **图的概念**:在图论中,图是由顶点(节点)和边组成的集合。顶点代表实体,边代表顶点之间的关系或连接。 2. **有向图与无向图**:在迪杰斯特拉...
自己用c语言写的迪杰斯特拉算法,存储方式为邻接矩阵表示法
### 使用C语言实现的迪杰斯特拉算法:深入解析与应用 #### 知识点一:迪杰斯特拉算法概述 迪杰斯特拉算法(Dijkstra's Algorithm)是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉于1956年提出的一种用于寻找图中两点间...
用c语言实现的地杰斯特拉算法,,,其中具体2.txt中的为: 6 9999 9999 10 9999 30 100 9999 9999 5 9999 9999 9999 9999 9999 9999 50 9999 9999 9999 9999 9999 9999 9999 10 9999 9999 9999 20 9999 60 9999 ...
本篇文章将深入探讨这些主题,特别是关键路径的实现、迪杰斯特拉算法和弗洛伊德算法。 首先,关键路径(Critical Path Method, CPM)是一种项目管理技术,用于确定项目中最长的依赖路径,这条路径决定了项目的最短...
在C语言中实现迪杰斯特拉算法,首先需要理解其基本步骤: 1. 初始化:创建一个图的数据结构,通常可以使用邻接矩阵或邻接表来表示。设置源节点的距离为0,其余所有节点的距离为无穷大。创建一个优先队列(如最小堆...
以下是对迪杰斯特拉算法及其C语言实现的详细解释: 1. **迪杰斯特拉算法介绍** - 迪杰斯特拉算法是一种基于贪心策略的单源最短路径算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。 - 算法的核心思想是...
C语言实现迪杰斯特拉算法,亲测好用,放在正确的环境下就可运行
C语言实现迪杰斯特拉算法,首先需要定义数据结构来表示图,这通常可以通过邻接矩阵或邻接表来完成。邻接矩阵是一个二维数组,每个元素表示一对节点之间是否存在边及其权重;邻接表则是链表结构,每个节点存储其相邻...
可以直接运行的最短路径算法,C程序编写,注释清晰
### 数据结构C语言版_迪杰斯特拉算法详解 #### 核心概念解析 迪杰斯特拉算法(Dijkstra's Algorithm)是解决图论中单源最短路径问题的经典算法,由荷兰计算机科学家艾兹赫尔·迪杰斯特拉于1956年提出。该算法适用于...
在C语言中实现迪杰斯特拉算法,首先需要理解C语言的基本语法和结构,包括函数的定义和调用,以及数据结构的使用。 C语言是一种强大的编程语言,它支持多种数据结构,如栈、队列、树和图。在处理图数据结构时,迪杰...
该程序为Dijkstra算法的的c语言程序,Dijkstra算法一般指迪杰斯特拉算法。迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的...
在这个“C语言课程设计”项目中,我们使用C语言实现了迪杰斯特拉算法来解决最少费用问题。这个算法的核心在于寻找从源节点到其他所有节点的最短路径,特别适用于有向图或无向图中权值非负的情况。 在C语言中,实现...
通过阅读和理解这些代码,可以加深对Dijkstra算法及其C语言实现的理解。 总之,Dijkstra算法是图论中的重要算法,广泛应用于路由选择、网络最优化问题等领域。在C语言中实现Dijkstra算法需要掌握图的表示、优先队列...
用C语言写的简单的迪杰斯特拉算法实现,仅供参考,欢迎交流。
迪杰斯特拉算法 c语言实现 数据结构课程