_DataStructure_C_Impl:Dijkstra算法求最短路径
// _DataStructure_C_Impl:Dijkstra
#include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 100000 //定义一个无限大的值
#define MaxSize 50 //最大顶点个数
typedef int PathMatrix[MaxSize][MaxSize]; //定义一个保存最短路径的二维数组
typedef int ShortPathLength[MaxSize]; //定义一个保存从顶点v0到顶点v的最短距离的数组
typedef enum{DG,DN,UG,UN}GraphKind;
typedef struct{
VRType adj; //对于无权图,用1表示相邻,0表示不相邻;对于带权图,存储权值
InfoPtr *info; //与弧或边的相关信息
}ArcNode,AdjMatrix[MaxSize][MaxSize];
//图的类型定义
typedef struct{
VertexType vex[MaxSize]; //用于存储顶点
AdjMatrix arc; //邻接矩阵,存储边或弧的信息
int vexnum,arcnum; //顶点数和边(弧)的数目
GraphKind kind; //图的类型
}MGraph;
//加入一个存储网的行、列和权值的类型定义
typedef struct{
int row;
int col;
int weight;
}GNode;
//採用邻接矩阵表示法创建有向网N
void CreateGraph(MGraph *N,GNode *value,int vnum,int arcnum,VertexType *ch){
int i,j,k,w;
char s[MaxSize];
VertexType v1,v2;
N->vexnum=vnum;
N->arcnum=arcnum;
for(i=0;i<vnum;i++)
strcpy(N->vex[i],ch[i]);
//初始化邻接矩阵
for(i=0;i<N->vexnum;i++)
for(j=0;j<N->vexnum;j++){
N->arc[i][j].adj=INFINITY;
N->arc[i][j].info=NULL; //弧的信息初始化为空
}
for(k=0;k<arcnum;k++){
i=value[k].row;
j=value[k].col;
N->arc[i][j].adj=value[k].weight;
}
N->kind=DN; //图的类型为有向网
}
//输出邻接矩阵存储表示的图N
void DisplayGraph(MGraph N){
int i,j;
printf("有向网具有%d个顶点%d条弧。顶点依次是: ",N.vexnum,N.arcnum);
for(i=0;i<N.vexnum;++i) //输出网的顶点
printf("%s ",N.vex[i]);
printf("\n有向网N的:\n"); //输出网N的弧
printf("序号i=");
for(i=0;i<N.vexnum;i++)
printf("%8d",i);
printf("\n");
for(i=0;i<N.vexnum;i++)
{
printf("%8d",i);
for(j=0;j<N.vexnum;j++)
printf("%8d",N.arc[i][j].adj);
printf("\n");
}
}
/*用Dijkstra算法求有向网N的v0顶点到其余各顶点v的最短路径P[v]及带权长度D[v]*/
/*final[v]为1表示v∈S,即已经求出从v0到v的最短路径*/
void Dijkstra(MGraph N,int v0,PathMatrix path,ShortPathLength dist){
int v,w,i,k,min;
int final[MaxSize]; //记录v0到该顶点的最短路径是否已求出
for(v=0;v<N.vexnum;v++){ //数组dist存储v0到v的最短距离,初始化为v0到v的弧的距离
final[v]=0;
dist[v]=N.arc[v0][v].adj;
for(w=0;w<N.vexnum;w++)
path[v][w]=0;
if(dist[v]<INFINITY){ //假设从v0到v有直接路径。则初始化路径数组
path[v][v0]=1;
path[v][v]=1;
}
}
dist[v0]=0; //v0到v0的路径为0
final[v0]=1;//v0顶点并入集合S
/*从v0到其余G.vexnum-1个顶点的最短路径,并将该顶点并入集合S*/
for(i=1;i<N.vexnum;i++){
min=INFINITY;
for(w=0;w<N.vexnum;w++)
if(!final[w]&&dist[w]<min){ //在不属于集合S的顶点中找到离v0近期的顶点
v=w; //将其离v0近期的顶点w赋给v,其距离赋给min
min=dist[w];
}
final[v]=1; //将v并入集合S
for(w=0;w<N.vexnum;w++) //利用新并入集合S的顶点。更新v0到不属于集合S的顶点的最短路径长度和最短路径数组
if(!final[w]&&min<INFINITY&&N.arc[v][w].adj<INFINITY&&(min+N.arc[v][w].adj<dist[w])){
dist[w]=min+N.arc[v][w].adj;
for(k=0;k<N.vexnum;k++)
path[w][k]=path[v][k];
path[w][w]=1;
}
}
}
void main(){
int i,j,vnum=6,arcnum=9;
MGraph N;
GNode value[]={{0,1,30},{0,2,60},{0,4,150},{0,5,40},
{1,2,40},{1,3,100},{2,3,50},{3,4,30},{4,5,10}};
VertexType ch[]={"v0","v1","v2","v3","v4","v5"};
PathMatrix path; /*用二维数组存放最短路径所经过的顶点*/
ShortPathLength dist; /*用一维数组存放最短路径长度*/
CreateGraph(&N,value,vnum,arcnum,ch); /*创建有向网N*/
DisplayGraph(N); /*输出有向网N*/
Dijkstra(N,0,path,dist);
printf("%s到各顶点的最短路径长度为:\n",N.vex[0]);
for(i=0;i<N.vexnum;++i)
if(i!=0)
printf("%s-%s:%d\n",N.vex[0],N.vex[i],dist[i]);
system("pause");
}
_DataStructure_C_Impl:Dijkstra算法求最短路径的更多相关文章
- Dijkstra算法求最短路径(java)(转)
原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 通俗易懂理解——dijkstra算法求最短路径
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...
- Dijkstra算法求最短路径 Java实现
基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...
- Java实现Dijkstra算法求最短路径
任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...
- Dijkstra算法求最短路径
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h&g ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- js迪杰斯特拉算法求最短路径
1.后台生成矩阵 名词解释和下图参考:https://blog.csdn.net/csdnxcn/article/details/80057574 double[,] arr = new double ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
随机推荐
- 关于Scrapy爬虫项目运行和调试的小技巧(上篇)
扫除运行Scrapy爬虫程序的bug之后,现在便可以开始进行编写爬虫逻辑了.在正式开始爬虫编写之前,在这里介绍四种小技巧,可以方便我们操纵和调试爬虫. 一.建立main.py文件,直接在Pycharm ...
- [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂
Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...
- 【BZOJ4016】【FJOI2014】最短路径树问题
题意: Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列 ...
- 【BZOJ4444】国旗计划 - 决策单调性
Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...
- React显示文件夹中SVG
import React from 'react'; import _ from 'lodash'; import styles from './iconPicker.less'; const req ...
- finger---用于查找并显示用户信息
finger finger命令用于查找并显示用户信息.包括本地与远端主机的用户皆可,帐号名称没有大小写的差别.单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名 ...
- HTML5 界面元素 Canvas 參考手冊
HTML5 界面元素 Canvas 參考手冊 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协 ...
- Object-c Associated Object
oc的关联的作用在我看来就是将两个对象关联起来,用的时候通过key和对象把和这个对象关联的对象再取出来(我做的项目就是和UITableView里面的一个属性关联起来了) 举个栗子: - (void)v ...
- Linux系统编程——进程间通信:管道(pipe)
管道的概述 管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,全部的 UNIX 系统都支持这样的通信机制. 无名管道有例如以下特点: 1.半双工,数据在同一时刻仅仅能在一个 ...
- The broken pedometer-纯暴力枚举
The broken pedometer Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu i ...