c语言实现求最短路径(迪杰斯特拉算法,《数据结构》算法7.15)
来源:互联网 发布:怎样抢到淘宝秒杀产品 编辑:程序博客网 时间:2024/05/22 17:17
迪杰斯特拉算法从小到大的求出了从源点到其余各个点的最短路径,用到了邻接矩阵的储存结构。
代码如下:
#include<stdio.h>#define MAX_VERTEX_NUM 100#define INFINITY 2000000000typedef struct {int vexs[MAX_VERTEX_NUM];int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vexnum,arcnum;}MGraph;int LocateVex(MGraph G,int v){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==v)return i;}}void CreateUDN(MGraph &G){int i,j,k;printf("输入顶点个数和弧的个数:\n");scanf("%d%d",&G.vexnum,&G.arcnum);//输入顶点个数,弧额条数,以及是否有关于弧的相关信息 printf("输入各个顶点的名称(数字):\n"); for(i=0;i<G.vexnum;i++)scanf("%d",&G.vexs[i]);//输入各个顶点,这里顶点的数据类型默认为int类型for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) if(i==j)G.arcs[i][j]=0;//顶点自身到自身的权值为0 else G.arcs[i][j]=INFINITY;//初始化图 printf("输入各条弧的两个顶点和权值:\n"); for(k=0;k<G.arcnum;k++){int v1,v2,weight;scanf("%d %d %d",&v1,&v2,&weight);//输入弧的两个顶点 i=LocateVex(G,v1);j=LocateVex(G,v2);//寻找两个顶点在矩阵中的位置 G.arcs[i][j]=weight;G.arcs[j][i]=G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1> } }bool P[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//p[v][w]==ture代表w是从v0到v的最短路径中的顶点 bool final[MAX_VERTEX_NUM];//final[v]代表已经找到v0到v的最短路径 int D[MAX_VERTEX_NUM];//最短路径的带权长度 void ShortestPath_DLJ(MGraph G,int v0){int v,w,i,j;for(v=0;v<G.vexnum;v++){final[v]=false; //初始化 D[v]=G.arcs[v0][v]; for(w=0;w<G.vexnum;w++) P[v][w]=false;//每条路径都先设为空 if(D[v]<INFINITY){P[v][v0]=true; P[v][v]=true;}//如果v与v0直接连接,则添加路径 }D[v0]=0; final[v0]=true; //初始化,v0顶点属于S集合,即找到最短路径的集合 for(i = 1;i<G.vexnum;i++){//每次循环求得一个v0到某个v顶点的最短路径,并将v加到S集合 int minn=INFINITY;for(w = 0;w<G.vexnum;w++)if(!final[w]) if(D[w]<minn){v = w;minn = D[w];}//找到距离v0最近的点 final[v]=true;for(w = 0;w<G.vexnum;w++)//更新当前最短路径及距离 if(!final[w]&&(minn+G.arcs[v][w])<D[w]){//修改D[w]和P[w],w属于V-S D[w] = minn+G.arcs[v][w]; for(j=0;j<G.vexnum;j++){//将v的路径赋值给P[w] if(P[v][j]=true)P[w][j]=true; } P[w][w]=true;//添加路径的最后一个点w } }} void Print_ShortestPath(MGraph G,int v0){int i,j;for(i=0;i<G.vexnum;i++){printf("%d->%d:",v0,i);printf("%d\n",D[i]);}}int main(){MGraph G;CreateUDN(G);int v0;printf("输入起始顶点:\n"); scanf("%d",&v0);//最短路径的起始点v0 ShortestPath_DLJ(G,v0);//求出从v0出发至各个点的最短路径 Print_ShortestPath(G,v0); //输出从v0出发至各个点的最短路径权值合 return 0;}
0 0
- c语言实现求最短路径(迪杰斯特拉算法,《数据结构》算法7.15)
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
- 数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法
- 数据结构(C#)--Dijkstra 算法的最小路径的实现
- 数据结构与算法(C语言)<算法>
- 算法导论C语言实现: 基本数据结构
- Dantjig算法求最短路径的c语言实现
- 最短路径迪杰斯特拉算法C语言实现__Dijkstra
- 数据结构中的排序查找算法(C语言实现)
- c语言实现拓扑排序(《数据结构》算法7.12)
- 排序-c语言实现(摘自数据结构与算法分析c语言实现)
- C语言实现 迪杰斯特拉算法
- 数据结构与算法(C语言)<绪论>
- 排序 - C语言实现(摘自数据结构与算法分析C语言描述))
- 栈及其应用 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 队列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 二叉查找树 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 散列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 快速排序
- PAT-1082. Read Number in Chinese (25)(模拟)
- set集中查找find
- Android布局的各种对齐问题
- golang捕获ctrl+c退出程序
- c语言实现求最短路径(迪杰斯特拉算法,《数据结构》算法7.15)
- http协议三次握手
- C# 开放类型与封闭类型
- PAT-A1028. List Sorting (25)(排序.)
- android中getSystemService详解
- Leetcode263. Ugly Number
- LA 4986 三分
- Activity的生命周期
- [运筹学]关于动态规划的2个问题-最长公共子序列与最长非降子序列问题