/*实现迪杰斯特拉的最短单源路径算法*/
//此算法可以实现查找单元最短路径,并打印出各点的最短路径值及路径上各点
#include<stdio.h></stdio.h>
#include<stdlib.h></stdlib.h>
#include<malloc.h></malloc.h>
#define INFINITY 1000
typedef int VRType;
typedef char InfoType;
typedef int VertexType;
typedef enum{DG,DN,AG,AN} GraphKind; //定义图类型
typedef struct arccell{
VRType adj;
InfoType *info;
}ArcCell;
typedef struct graph{
VertexType *vexs;
ArcCell **arcs;
int vexnum;
int arcnum;
GraphKind kind;
}Graph;
typedef struct result{
int **PathMatrix;
int *ShortPathTable;
}Result;
void CreateDN(Graph *dn,Result *r) //根据输入产生图
{
int i,j,m,k,x,y,a,b,e,n;
char c;
printf("请输入图的节点数\n");
scanf("%d",&n);
dn->vexnum=n;
dn->kind=DN;
dn->vexs=(VertexType *)malloc(sizeof(VertexType)*n);
ArcCell **temp=(ArcCell **)malloc(sizeof(ArcCell *)*n);
for(i=0;iarcs=temp;
int **tmp=(int **)malloc(sizeof(int *)*n);
for(i=0;iPathMatrix=tmp;
r->ShortPathTable=(int *)malloc(sizeof(int)*n);
printf("请依次输入各节点的值\n");
for(i=0;ivexs[i]);
}
for(i=0;iarcs[i][j].adj=INFINITY;
dn->arcs[i][j].info=NULL;
}
}
printf("边是否有附加信息(Y/N)?\n");
c=getch();
putch(c);
printf("\n");
if(c=='Y'||c=='y')
m=1;
else m=0;
printf("请输入边数\n");
scanf("%d",&k);
dn->arcnum=k;
printf("请按先头节点后尾节点然后权的顺序输入边\n");
for(i=0;ivexs[a])
break;
printf("尾节点");
scanf("%d",&y);
for(b=0;bvexs[b])
break;
printf("权值");
scanf("%d",&e);
dn->arcs[a][b].adj=e;
if(m){
printf("请输入附加信息\n");
scanf("%s",&dn->arcs[a][b].info);
}
}
}
void ShortPath_DIJ(Graph *g,int v0,Result *r)
{
int v,w,i,min,j;
int *final;
final=(int *)malloc(sizeof(int)*g->vexnum);
for(v=0;vvexnum;v++)
{
final[v]=0;
r->ShortPathTable[v]=g->arcs[v0][v].adj;
for(w=0;wvexnum;w++)
r->PathMatrix[v][w]=-1;
if(r->ShortPathTable[v]PathMatrix[v][0]=v0;
r->PathMatrix[v][1]=v;
}
}
r->ShortPathTable[v0]=0;
final[v0]=1;
for(i=1;ivexnum;i++)
{
min=INFINITY;
for(w=0;wvexnum;w++)
{
if(!final[w])
if(r->ShortPathTable[w]ShortPathTable[w];
}
}
final[v]=1;
for(w=0;wvexnum;w++)
{
if(!final[w]&&(min+g->arcs[v][w].adjShortPathTable[w])){
r->ShortPathTable[w]=min+g->arcs[v][w].adj;
for(j=0;jvexnum;j++)
{
r->PathMatrix[w][j]=r->PathMatrix[v][j]; //此为打印路径的关键步骤
if(r->PathMatrix[w][j]==-1){
r->PathMatrix[w][j]=w;
break;
}
}
}
}
}
}
void Print(Graph *dn,int a,Result *r)
{
int i,j;
printf("%d到各顶点的最短路径如下\n",a);
for(i=0;ivexnum;i++)
{
printf("%d到%d的最短路径长%d,\n",a,dn->vexs[i],r->ShortPathTable[i]);
printf("路径是\n");
for(j=0;jvexnum;j++)
{
if(r->PathMatrix[i][j]>-1)
printf("%2d",dn->vexs[r->PathMatrix[i][j]]);
}
printf("\n");
}
}
main()
{
int a,v,n;
Graph dn;
Result r;
CreateDN(&dn,&r);
printf("寻找哪个定点的最小路径?\n");
scanf("%d",&a);
for(v=0;v
分享到:
相关推荐
### 基于迪杰斯特拉的最短单源路径算法的公交车调度问题 #### 数学模型概述 本文探讨了如何利用迪杰斯特拉(Dijkstra)算法解决公交车调度问题中的最短路径寻找问题。公交车调度是城市公共交通系统中一个重要的...
### 迪杰斯特拉最短路径算法及其应用 #### 一、引言 在现代信息技术领域,图论作为计算机科学的基础之一,在解决实际问题时扮演着至关重要的角色。其中一个非常典型的应用场景就是寻找两个节点之间的最短路径问题...
在给定的"迪杰斯特拉最短路径vc程序"中,开发者使用了VC6.0这一早期的Microsoft Visual C++开发环境来实现这一算法。 VC6.0是微软推出的一款集成开发环境,支持C和C++语言,虽然现在已经有些过时,但仍然是许多...
迪杰斯特拉(Dijkstra)算法是一种用于寻找有向图中单源最短路径的经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。在这个算法中,我们从一个源节点开始,逐步扩展最短路径到其他节点,直到到达所有...
迪杰斯特拉算法(Dijkstra's Algorithm)是寻找有向或无向图中单源最短路径的算法。由艾兹格·迪杰斯特拉在1956年提出,主要用于解决实际生活中的路线规划问题。该算法的核心思想是从起始节点开始,逐步扩展最短路径...
经典算法Dijkstra 的实现,基于XNA平台,C#语言,可视化的展示形式。 用法:拖拽节点到合适位置,按一次键盘S键后用鼠标点击两个节点,然后用小键盘区的数字键可设置权值。按B键再点节点设置起点,按E再点节点设置...
迪杰斯特拉(Dijkstra)算法是图论中一个非常重要的算法,主要用于寻找有向或无向图中从源节点到其他所有节点的最短路径。这个算法由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出,它的核心思想是通过逐步扩展...
迪杰斯特拉(Dijkstra)算法是图论中一个经典的单源最短路径算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。这个算法主要用于解决在加权图中找到从指定起始节点到其他所有节点的最短路径问题。加权图指的...
迪杰斯特拉算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都...
迪杰斯特拉算法是计算机科学与图论中用于解决有向图中单源最短路径问题的一个经典算法。由荷兰计算机科学家埃德斯格·迪杰斯特拉于1956年提出,算法能够找到从某一源点至其他所有顶点的最短路径。它不仅在理论上具有...
### 图解迪杰斯特拉(Dijkstra)最短路径算法 #### 一、最短路径的概念及应用 在深入探讨迪杰斯特拉算法之前,有必要先理解“最短路径”的基本概念及其应用场景。 ##### 1. **源点与终点** 在任意路径中,**源点...
一.问题描述 设计、实现一个全国大城市间的交通咨询程序,为旅客提供四种最优决策方案:(1)飞行时间最短(2)总用时最短(3)费用最小(4)中转次数最少。 二、实验要求 ...(2)实现单源最短路径算法
迪杰斯特拉(Dijkstra)算法是解决此类问题的一种高效方法,尤其适用于寻找单源最短路径,即从一个特定起点到图中所有其他顶点的最短路径。本篇文章将深入探讨迪杰斯特拉算法及其在MATLAB环境中的实现。 迪杰斯特拉...
迪杰斯特拉(Dijkstra)算法是图论中一个经典的单源最短路径算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。这个算法主要用于解决带权重的有向图中从某一点到其余所有点的最短路径问题。在本案例中,我们...
在图论中,迪杰斯特拉算法是一种常用的寻找单源最短路径问题的算法。该算法由荷兰计算机科学家艾兹赫·迪杰斯特拉(Edsger W. Dijkstra)于1959年提出。 迪杰斯特拉算法的基本思想 迪杰斯特拉算法的基本思想是依照...
迪杰斯特拉算法是解决图论中单源最短路径问题的经典算法之一,由荷兰计算机科学家艾兹赫尔·迪杰斯特拉于1956年提出。此算法能够有效地计算出一个起点到图中所有其他节点的最短路径,适用于带权图,并假设图中的边...
迪杰斯特拉算法(Dijkstra算法)是一种在加权图中寻找最短路径的经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉提出。它主要用于解决单源最短路径问题,即从图中的一个顶点(源点)出发,找到到达其他所有顶点的...
最短路径算法Dijkstra是图论中的一个经典算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出。该算法主要用于寻找带权重的有向或无向图中,从一个特定顶点到其他所有顶点的最短路径。Dijkstra算法的核心思想是...
迪杰斯特拉(Dijkstra)算法是解决单源最短路径问题的一种经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。它主要用于寻找图中一个起点到其他所有点的最短路径。在这个例子中,问题是要帮助Kiki找到从...
在这个压缩包中,"迪杰斯特拉最短路径.cpp"和"弗洛伊德最短路径.cpp"是两个C语言源文件,分别实现了这两种算法。通过阅读和学习这些代码,你可以更好地理解这两个算法的工作原理,同时提升你的C语言编程能力。 在...