关于迪杰斯特拉算法的实现

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define Max 20

#define INFINITY 65535

typedef char Onechange;

typedef struct Three {

Onechange ver[Max+1];

int edg[Max][Max];

}Three;

void Twochange( Three *g )

{

int i = 0;

int j = 0;

int Num;

Onechange Ver;

printf("输入图的顶点:\n");

while( '\n' != (Ver=getchar()) )

g->ver[i++] = Ver;

g->ver[i] = '\0';

Num = strlen(g->ver);

printf("请输入顶点相应的的邻接矩阵:\n");

for( i=0; i<Num; i++ )

for( j=0; j<Num; j++ )

scanf("%d", &g->edg[i][j]);

}

void PrintThree( Three g )

{

int i, j;

int Num = strlen(g.ver);

printf("图的顶点为:\n");

for( i=0; i<Num; i++ )

printf("%c ", g.ver[i]);

printf("\n");

printf("图的邻接矩阵为:\n");

for( i=0; i<Num; i++ ) {

for( j=0; j<Num; j++ )

printf("%d ", g.edg[i][j]);

printf("\n");

}

}

int CalVerNum( Three g )

{

return strlen(g.ver);

}

void SetWeight( Three *g )

{

for( int i=0; i<CalVerNum(*g); i++ )

for( int j=0; j<CalVerNum(*g); j++ )

if( 0 == g->edg[i][j] )

g->edg[i][j] = INFINITY;

}

void Dijkstra( Three g )

{

int Num = CalVerNum( g );

int j;

int mini;

int index = 0;

int *used = (int *)malloc(sizeof(int)*Num);

int *distance = (int *)malloc(sizeof(int)*Num);

int *parent = (int *)malloc(sizeof(int)*Num);

int *last = (int *)malloc(sizeof(int)*Num);

SetWeight( &g );

for( int i=0; i<Num; i++ ) {

used[i] = 0;

distance[i] = g.edg[0][i];

last[i] = 0;

}

used[0] = 1;

parent[index++] = 0;

for(int  i=0; i<Num-1; i++ ) {

j = 0;

mini = INFINITY;

for( int k=0; k<Num; k++ )

if( (0 == used[k]) && (distance[k] < mini) ) {

mini = distance[k];

j = k;

}

used[j] = 1;

for( int k=0; k<Num; k++ )

if( (0 == used[k]) && (distance[k] > distance[j] + g.edg[j][k]) ) {

distance[k] = distance[j] + g.edg[j][k];

}

parent[index++] = j;

}

printf("%c到%c的最短路径经过顶点依次为:\n", g.ver[0], g.ver[Num-1]);

for( int i=0; i<index; i++ )

printf("%c ", g.ver[parent[i]]);

printf("\n");

printf("最短路径长度为: %d\n", mini);

}

int main()

{

Three g;

Twochange( &g );

PrintThree( g );

Dijkstra( g );

return 0;

}

关于Floyd(弗洛伊德)算法的实现

#include <iostream>

#include <string>

#include <stdio.h>

using namespace std;

#define Maxnum 100

#define INF 32767

typedef struct

{

char vertex[Maxnum];

int edges[Maxnum][Maxnum];

int n,e;

}Mgraph;

void CreateMgraph(Mgraph &G)

{

int i,j,k,p;

cout<<"请输入顶点数和边数:";

cin>>G.n>>G.e;

cout<<"请输入顶点元素:";

for (i=0;i<G.n;i++)

{

cin>>G.vertex[i];

}

for (i=0;i<G.n;i++)

{

for (j=0;j<G.n;j++)

{

G.edges[i][j]=INF;

if (i==j)

{

G.edges[i][j]=0;

}

}

}

for (k=0;k<G.e;k++)

{

cout<<"请输入第"<<k+1<<"条弧头弧尾序号和相应的权值:";

cin>>i>>j>>p;

G.edges[i][j]=p;

}

}

void Dispath(int A[][Maxnum],int path[][Maxnum],int n);

void Floyd(Mgraph G)

{

int A[Maxnum][Maxnum],path[Maxnum][Maxnum];

int i,j,k;

for (i=0;i<G.n;i++)

{

for (j=0;j<G.n;j++)

{

A[i][j]=G.edges[i][j];

path[i][j]=-1;

}

}

for (k=0;k<G.n;k++)

{

for (i=0;i<G.n;i++)

{

for (j=0;j<G.n;j++)

{

if (A[i][j]>A[i][k]+A[k][j])

{

A[i][j]=A[i][k]+A[k][j];

path[i][j]=k;

}

}

}

}

Dispath(A,path,G.n);

}

void Patth(int path[][Maxnum],int i,int j)

{

int k;

k=path[i][j];

if (k==-1)

{

return;

}

Patth(path,i,k);

printf("%d,",k);

Patth(path,k,j);

}

void Dispath(int A[][Maxnum],int path[][Maxnum],int n)

{

int i,j;

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

{

if (A[i][j]==INF)

{

if (i!=j)

{

printf("从%d到%d没有路径\n",i,j);

}

}

else

{

printf("  从%d到%d=>路径长度:%d路径:",i,j,A[i][j]);

printf("%d,",i);

Patth(path,i,j);

printf("%d\n",j);

}

}

}

}

int main()

{

freopen("input2.txt", "r", stdin);

Mgraph G;

CreateMgraph(G);

Floyd(G);

return 0;

}

迪杰斯特拉算法和弗洛伊德算法相关推荐

  1. 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题

    1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...

  2. 普利姆(prim)算法与迪杰斯特拉(dijestella)算法

    一:普利姆(prim)算法 对于临界矩阵表示的图,时间复杂度为O(|V|2) 对于邻接表表示的图,时间复杂度为O(|V|+|E|) 代码: int dist[];//用来记录从原点到各个节点的距离 b ...

  3. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子

    目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...

  4. 六、最短路径——迪杰斯特拉(Dijkstra)算法

    在网图和非网图中,最短路径的含义是不同的.由于非网图它没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并 ...

  5. C++实现迪杰斯特拉(dijkstra)算法(最小生成树)

    迪杰斯特拉(dijkstra)算法是单源最短路径问题的求解方法.参考链接:算法之迪杰斯特拉(dijkstra)非常详细介绍_PRML_MAN的博客-CSDN博客_迪杰斯特拉 使用上面的链接提供的图片进 ...

  6. 算法之「迪杰斯特拉(Dijkstra)算法」

    最短路径 生活中,我们常常会面临着对路径的最优选择问题,可能是路程最短,也可能是时间最短,这个的最短路径就类似路程最短的选择. 比如在上海,乘地铁去某个地方,上海的地铁路线很多,从地图上看上去就是一个 ...

  7. 【数据结构】图—迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法是一个按路径长度递增的次序产生最短路径的算法,要求所有边的权重都为非负值. 算法思路 下图为一无向网图: 如果以A为源点,求A至各顶点的最短路径. (1)先将A到各点 ...

  8. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

  9. 图论最短距离(Shortest Path)算法动画演示-Dijkstra(迪杰斯特拉) 和 Floyd(弗洛伊德)

    视 频 地 址 : https://www.bilibili.com/video/BV1q4411M7r9?from=search&seid=16626092504824296903 Dijk ...

  10. 堆优化版迪杰斯特拉(Dijkstra)算法简单分析

    堆优化版迪杰斯特拉算法: 优化原理: 上面的朴素版迪杰斯特拉算法主要缺陷是,每当找到一个最短路径,如果需要找下一个最短路径,就需要在完成松弛操作之后,遍历dist数组,寻找其中的最小值.遍历dist数 ...

最新文章

  1. 创新时代的管理:《创新赢天下》
  2. 慢 SQL 诊断优化套路包,套路用的对,速度升百倍
  3. 算法导论笔记:17摊还分析
  4. nginx学习笔记(8)虚拟主机名---转载
  5. (附)python3 只需3小时带你轻松入门——python常用一般性术语或词语的简单解释
  6. switch和toggle在软件开发中的含义和区别
  7. django与grpc融合的过程
  8. Spring Boot CLI设置和HelloWorld示例
  9. js基础--变量、数据类型、循环、判断、函数定义
  10. php json 封装,laravel json返回封装
  11. 简单的重定义一下NSLOG
  12. 「Leetcode」242. 有效的字母异位词:可以拿数组当哈希表来用,但哈希值不要太大!
  13. 手机黑域ADB开启教程
  14. python定时任务启动与停止_Python启动定时任务
  15. 【Blender 入门系列】 02 乐高方块渲染
  16. springboot配置https
  17. C++泰勒公式实现反余弦函数
  18. 小知识·CMake基本指令
  19. 干货!MetaCorrection:解决无监督域适应的domain gap问题
  20. varchar和varchar2有什么区别?

热门文章

  1. (C语言)有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
  2. 吴军博士系列书籍读后感(《数学之美》、《浪潮之巅》、《文明之光》、《智能时代》)
  3. h5 life.html,H5 交互页编辑器 AEditor 介绍
  4. 遇见逆水寒服务器维护时间,《遇见逆水寒》7月23日更新公告
  5. handsontable 给单元格设置下拉 菜单
  6. file对象转换为Muti文件对象工具类
  7. 完整的微信登陆 接收消息流程
  8. JS算法笔记---移除元素
  9. gitee团队协作使用
  10. Android自动启用夜间模式,Android – 切换夜间模式