迪杰斯特拉算法和弗洛伊德算法
关于迪杰斯特拉算法的实现
#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;
}
迪杰斯特拉算法和弗洛伊德算法相关推荐
- 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题
1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...
- 普利姆(prim)算法与迪杰斯特拉(dijestella)算法
一:普利姆(prim)算法 对于临界矩阵表示的图,时间复杂度为O(|V|2) 对于邻接表表示的图,时间复杂度为O(|V|+|E|) 代码: int dist[];//用来记录从原点到各个节点的距离 b ...
- Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子
目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...
- 六、最短路径——迪杰斯特拉(Dijkstra)算法
在网图和非网图中,最短路径的含义是不同的.由于非网图它没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并 ...
- C++实现迪杰斯特拉(dijkstra)算法(最小生成树)
迪杰斯特拉(dijkstra)算法是单源最短路径问题的求解方法.参考链接:算法之迪杰斯特拉(dijkstra)非常详细介绍_PRML_MAN的博客-CSDN博客_迪杰斯特拉 使用上面的链接提供的图片进 ...
- 算法之「迪杰斯特拉(Dijkstra)算法」
最短路径 生活中,我们常常会面临着对路径的最优选择问题,可能是路程最短,也可能是时间最短,这个的最短路径就类似路程最短的选择. 比如在上海,乘地铁去某个地方,上海的地铁路线很多,从地图上看上去就是一个 ...
- 【数据结构】图—迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法是一个按路径长度递增的次序产生最短路径的算法,要求所有边的权重都为非负值. 算法思路 下图为一无向网图: 如果以A为源点,求A至各顶点的最短路径. (1)先将A到各点 ...
- 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
一.基础知识 有向图 无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...
- 图论最短距离(Shortest Path)算法动画演示-Dijkstra(迪杰斯特拉) 和 Floyd(弗洛伊德)
视 频 地 址 : https://www.bilibili.com/video/BV1q4411M7r9?from=search&seid=16626092504824296903 Dijk ...
- 堆优化版迪杰斯特拉(Dijkstra)算法简单分析
堆优化版迪杰斯特拉算法: 优化原理: 上面的朴素版迪杰斯特拉算法主要缺陷是,每当找到一个最短路径,如果需要找下一个最短路径,就需要在完成松弛操作之后,遍历dist数组,寻找其中的最小值.遍历dist数 ...
最新文章
- 创新时代的管理:《创新赢天下》
- 慢 SQL 诊断优化套路包,套路用的对,速度升百倍
- 算法导论笔记:17摊还分析
- nginx学习笔记(8)虚拟主机名---转载
- (附)python3 只需3小时带你轻松入门——python常用一般性术语或词语的简单解释
- switch和toggle在软件开发中的含义和区别
- django与grpc融合的过程
- Spring Boot CLI设置和HelloWorld示例
- js基础--变量、数据类型、循环、判断、函数定义
- php json 封装,laravel json返回封装
- 简单的重定义一下NSLOG
- 「Leetcode」242. 有效的字母异位词:可以拿数组当哈希表来用,但哈希值不要太大!
- 手机黑域ADB开启教程
- python定时任务启动与停止_Python启动定时任务
- 【Blender 入门系列】 02 乐高方块渲染
- springboot配置https
- C++泰勒公式实现反余弦函数
- 小知识·CMake基本指令
- 干货!MetaCorrection:解决无监督域适应的domain gap问题
- varchar和varchar2有什么区别?
热门文章
- (C语言)有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
- 吴军博士系列书籍读后感(《数学之美》、《浪潮之巅》、《文明之光》、《智能时代》)
- h5 life.html,H5 交互页编辑器 AEditor 介绍
- 遇见逆水寒服务器维护时间,《遇见逆水寒》7月23日更新公告
- handsontable 给单元格设置下拉 菜单
- file对象转换为Muti文件对象工具类
- 完整的微信登陆 接收消息流程
- JS算法笔记---移除元素
- gitee团队协作使用
- Android自动启用夜间模式,Android – 切换夜间模式