实验题目:图应用——寻找最短路径

实验目的:

  1. 了解图的基本概念及其存储方式;
  2. 学习最短路径算法——Dijkstra算法;
  3. 实现Dijkstra算法,并应用于寻找最短路径的问题。

实验内容:

  1. 实现图的存储,包括邻接矩阵和邻接表两种方式;
  2. 实现Dijkstra算法,求解图中任意两点之间的最短路径;
  3. 编写主程序,实现用户输入起点和终点,输出最短路径及其长度。

实验步骤:

  1. 图的存储:

(1)邻接矩阵:定义一个二维数组G[V][V],其中V为顶点数,如果V1到V2有边,则G[V1][V2]为边的权值,否则设为无穷大。

(2)邻接表:定义一个结构体数组,其中每个结构体包括一个顶点和它所连的边。在该结构体中可以用指针来表示下一个结构体,从而实现邻接表的存储。

  1. Dijkstra算法:

(1)初始化:将起点到各个节点的距离设为无穷大,将起点到自身的距离设为0。

(2)遍历:从起点开始,依次遍历所有与其相邻的节点,更新其到起点的距离。如果更新后的距离比原先的距离小,则更新该节点的距离,并将该节点加入到待遍历的集合中。

(3)重复:重复上述步骤,直到所有节点都被遍历过。

  1. 主程序:

(1)创建图,实现邻接矩阵和邻接表两种存储方式。

(2)输入起点和终点。

(3)调用Dijkstra算法,求解最短路径及其长度。

(4)输出最短路径和长度。

代码实现:

  1. 图的存储:

(1)邻接矩阵实现:

typedef struct{ int vexnum;//顶点数 int edgenum;//边数 int matrix[MAXVEX][MAXVEX];//邻接矩阵 }MGraph;

(2)邻接表实现:

typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 int weight;//弧的权值 struct ArcNode *next;//指向下一条弧的指针 }ArcNode;

typedef struct VertexNode{ char data;//顶点信息 ArcNode *firstarc;//指向第一条依附该顶点的弧的指针 }VertexNode,AdjList[MAXVEX];

typedef struct{ AdjList vertices;//邻接表 int vexnum;//图的当前顶点数 int edgenum;//图的当前边数 }ALGraph;

  1. Dijkstra算法实现:

void Dijkstra(MGraph G, int v0, int *dist, int *prev){ int i,j,k; int min; int tmp; int flag[MAXVEX];//flag[i]表示顶点i是否已经在S集合中 for (i=0;i<G.vexnum;i++){ flag[i]=0;//初始化 dist[i]=G.matrix[v0][i];//初始化起点到各个顶点的距离 prev[i]=0;//初始化前驱顶点 } flag[v0]=1;//将起点加入到S集合中 dist[v0]=0;//起点到自身的距离为0 for (i=1;i<G.vexnum;i++){ min=INFINITY;//初始化最小值为无穷大 for (j=0;j<G.vexnum;j++){ if (!flag[j]&&dist[j]<min){//寻找距离最小的顶点 min=dist[j]; k=j; } } flag[k]=1;//将距离最小的顶点加入到S集合中 for (j=0;j<G.vexnum;j++){ tmp=(G.matrix[k][j]==INFINITY?INFINITY:(min+G.matrix[k][j]));//更新距离 if (!flag[j]&&tmp<dist[j]){ dist[j]=tmp; prev[j]=k;//更新前驱顶点 } } } }

  1. 主程序:

int main(){ int i,j; int v0,v1; int dist[MAXVEX]; int prev[MAXVEX]; MGraph MG; ALGraph AG; //创建邻接矩阵 CreateMGraph(&MG); //创建邻接表 CreateALGraph(&AG); //输入起点和终点 printf("请输入起点和终点:\n"); scanf("%d%d",&v0,&v1); //求解最短路径及其长度 Dijkstra(MG,v0,dist,prev); printf("起点到终点的最短路径为:"); i=v1; printf("%d<-",i); while (prev[i]!=v0){ printf("%d<-",prev[i]); i=prev[i]; } printf("%d\n",v0); printf("最短路径的长度为:%d\n",dist[v1]); return 0;

写一篇数据结构关于图应用实验报告要求用C语言写出代码

原文地址: https://www.cveoy.top/t/topic/ffCu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录