`

弗洛伊德算法C语言实现

阅读更多
#ifndef GUIDE_H_INCLUDED
#define GUIDE_H_INCLUDED
#define MX 1000          //最大值 无穷
#define NUM  17             //最大顶点个数
typedef int adjmatrix[NUM][NUM];
typedef int path[NUM][NUM][NUM];
const int vexs[NUM] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
int arcs[NUM][NUM] = {
    {0 ,20,MX,MX,20,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX},
    {20,0 ,30,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX},
    {MX,30,0 ,20,MX,30,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX},
    {MX,MX,20,0 ,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX},
    {20,MX,MX,MX,0 ,10,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX},
    {MX,MX,30,MX,10,0 ,20,50,MX,MX,MX,MX,MX,MX,MX,MX,MX},
    {MX,MX,MX,MX,MX,20,0 ,40,10,MX,MX,MX,MX,MX,MX,MX,MX},
    {MX,MX,MX,MX,MX,50,40,0 ,MX,20,20,MX,MX,MX,MX,MX,MX},
    {MX,MX,MX,MX,MX,MX,10,MX,0 ,20,MX,MX,MX,30,MX,MX,MX},
    {MX,MX,MX,MX,MX,MX,MX,20,20,0 ,20,MX,MX,MX,MX,MX,MX},
    {MX,MX,MX,MX,MX,MX,MX,20,MX,20,0 ,20,MX,MX,MX,MX,MX},
    {MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,20,0 ,10,MX,MX,MX,MX},
    {MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,10,0 ,MX,MX,20,MX},
    {MX,MX,MX,MX,MX,MX,MX,MX,30,MX,MX,MX,MX,0 ,20,MX,MX},
    {MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,20,0 ,20,MX},
    {MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,20,MX,20,0 ,40},
    {MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,MX,40,0 }
    };
#endif

 

#include <iostream>
using namespace std;
#include "guide.h"

//=====================================================
void Floeyd( adjmatrix G, adjmatrix D, path P )
{//利用弗洛伊德算法求图GA中每对顶点间的最短长度,对应存于二维数组A中
    for(int v=0; v<NUM; v++)
        for(int w=0; w<NUM; w++){
            D[v][w]=G[v][w];
            for( int u=0; u<NUM; ++u) P[v][w][u]=0;     //0表示FALSE
            if(D[v][w]<MX){
                P[v][w][v]=1;   P[v][w][w]=1;           //1表示TRUE
            }
        }
    for(int u=0; u<NUM; u++)
        for(int v=0; v<NUM; v++)
            for(int w=0; w<NUM; w++)
                if( D[v][u]+D[u][w]<D[v][w]) {
                    D[v][w] =D[v][u]+D[u][w];
                    for( int i=0; i<NUM; ++i)
                        P[v][w][i]=P[v][u][i];
                }
}

//=====================================================
 void guide( adjmatrix GA, int a, int b ,int judge)     //judge判断,1则为start < end,0则为start > end
 {
     adjmatrix D;       //D[i,j]表示从i到j的最短距离;
     path P;       //P[i,j]表示从i到j的最短路径上j的父节点
     Floeyd( GA, D, P );
     cout << D[a][b] << endl;
     cout << "路径为:";
     if( judge==1 )
     {
         for(int u=a;u<b;u++)
         {
                if(P[a][b][u] == 1){
                    cout << u+1 << "->";
                    a=u;
                }
         }
         cout << b+1 << endl;
     }
     else if( judge==0 )
     {
         int i=0;
         int t[NUM]={0};
         for(int u=a;u<b+1;u++)
         {
                if(P[a][b][u] == 1){
                    t[++i]=u+1;
                    a=u;
                }
         }
         for(; i>1; i--)
         {
             cout << t[i] << "->";
         }
         cout << t[1] << endl;
     }
 }
void ShortestPath()
{
    int start = 5;
    int end = 5;
    cout << "输入出发点和目的地编号 (1~17 空格分隔)" << endl;
    cin >> start >> end;
    if(start>0 && start<18 && end>0 && end<18)
    {
            cout <<"从"<< start;
            cout << "到" << end ;
            cout << "的最短路径长度 :" ;
        if(start<=end)
            guide( arcs, start-1, end-1 ,1);
        else
            guide( arcs, end-1, start-1 ,0);
    }
    else
        cout << "没有这个地方!" << endl;
}


//============== mian文件 =============

int main()
{
    char choose=0;
    cout << "************************" << endl;
    cout << "    a.x到y的最短路径        " << endl;
    cout << "    b.退出            " << endl;
    cout << "    版本号v1.8        " << endl;
    cout << "************************" << endl;
    cin >> choose;
    while( choose!='b' )
    {
        if( choose=='a' )
        {
            ShortestPath();
            cout << "===========================" << endl;
            cout << "  a.x到y的最短路径 b.退出  " << endl;
            cout << "===========================" << endl;
        }
        else if(choose!='a'||choose!='b')    cout << "输入错误,请重新输入:";
        cin >> choose;
    }
    return 0;
}

 

分享到:
评论

相关推荐

    弗洛伊德算法c语言实现

    以上就是基于C语言实现的弗洛伊德算法的详细介绍。通过这种方法,我们不仅可以找到任意两点之间的最短路径长度,还可以追踪出这条最短路径的具体组成。这对于解决实际问题中的路径规划、网络分析等领域具有重要意义...

    关键路径实现,迪杰斯特拉算法,弗洛伊德算法

    本篇文章将深入探讨这些主题,特别是关键路径的实现、迪杰斯特拉算法和弗洛伊德算法。 首先,关键路径(Critical Path Method, CPM)是一种项目管理技术,用于确定项目中最长的依赖路径,这条路径决定了项目的最短...

    C语言弗洛伊德算法实现校园导航系统

    本项目“C语言弗洛伊德算法实现校园导航系统”就是一个很好的实例,它将理论与实践结合,展示了如何运用计算机科学中的经典算法来解决实际问题。 弗洛伊德算法(Floyd-Warshall Algorithm)是一种求解图中所有顶点...

    c语言源代码基于弗洛伊德算法的走迷宫找出路程序

    《C语言实现弗洛伊德算法解迷宫问题详解》 在编程领域,解决迷宫问题是一项有趣的挑战,尤其在C语言这样的低级语言中,它能帮助我们深入理解算法和数据结构。本文将详细讲解如何使用C语言,结合弗洛伊德算法,来...

    图的弗洛伊德算法

    《图的弗洛伊德算法详解与C/C++实现》 在计算机科学领域,图论是一种重要的理论基础,而求解图中的最短路径问题则是图论中的核心问题之一。弗洛伊德算法(Floyd-Warshall Algorithm)就是解决这类问题的有效方法,...

    最短路径弗洛伊德算法代码实现+MFC实现

    最短路径弗洛伊德算法是一种在图论中用于寻找两个节点之间最短路径的算法,由美国数学家Warren H. Floyd于1962年提出。它适用于有权值的加权图,并且能够找到所有节点对之间的最短路径。在本项目中,这个算法被实现...

    数据结构的16个算法C语言实现

    这些算法在C语言中实现,为程序员提供了更底层的控制,以高效地处理各种数据集。以下是对这些算法的详细解释: 1. KMP模式匹配算法:KMP算法用于在一个文本串中查找一个模式串的出现位置,通过构建next值表避免了...

    求最短路径的两种算法(C语言实现)

    本文将深入探讨两种常用的最短路径算法:Dijkstra算法和Floyd-Warshall算法,并提供C语言实现的概述。 首先,我们来看Dijkstra算法。Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出的,主要用于...

    弗洛伊德算法代码XC语言实现方式.docx

    ________________________________________目录:1,基本概念2,图.h3,10 最短路径(弗洛伊德算法).h4,弗洛伊德算法的代码实现________________________________________1,基本概念/*迪杰斯特拉算法求的是一个...

    欧拉图判定(C语言实现)

    Warshall算法,也称为弗洛伊德算法,是一个用于求解所有顶点对之间的最短路径问题的算法,但它同样可以用于检测图的连通性。在C语言中,我们可以用二维数组来表示邻接矩阵,然后通过Warshall算法迭代地更新这个矩阵...

    MFCApplication1_地铁计费_c/C++_弗洛伊德算法_

    - MFCApplication1.cpp 和 MFCApplication1.h:这是应用程序的主要类,负责初始化、事件处理等核心逻辑,弗洛伊德算法的实现可能会在这个文件中。 - stdafx.cpp 和 stdafx.h:这些文件通常包含预编译头,用于提高...

    C语言编写最短路径算法(含迪杰斯特拉、弗洛伊德)

    本压缩包文件包含两种著名的最短路径算法的C语言实现:迪杰斯特拉算法(Dijkstra's Algorithm)和弗洛伊德算法(Floyd-Warshall Algorithm)。这两种算法各有特点,适用于不同的问题场景。 1. 迪杰斯特拉算法: ...

    校园地图的最小路径问题(弗洛伊德算法)(数据结构课程设计)

    总结起来,"校园地图的最小路径问题"是一个综合性的实践项目,它融合了C语言、数据结构、算法设计等多方面知识,通过弗洛伊德算法的实现,学生可以深入理解图的最短路径问题,提升编程和问题解决能力。在实际操作中...

    C 代码 实现弗洛伊德算法以查找最短距离 在有向图上的节点对之间.rar

    以下是C语言实现弗洛伊德算法的步骤: 1. 定义一个二维数组`dist`来存储节点之间的最短距离,数组的大小为`n x n`,其中`n`是图中节点的数量。初始时,`dist[i][j]`表示节点`i`到`j`的直接距离(如果存在边),否则...

    C 代码 计算有向图中所有节点对之间的距离 使用弗洛伊德算法的加权边缘.rar

    标题中的"C 代码 计算有向图中所有节点对之间的距离 使用弗洛伊德算法的加权边缘"指的是一个C语言编写的程序,该程序实现了计算有向图中所有节点对之间最短路径的经典算法——弗洛伊德算法。弗洛伊德算法是一种解决...

    弗洛伊德(Floyd)算法求任意两点间的最短路径

    在Java中,我们可以使用如下的`FloydInGraph`类实现弗洛伊德算法: ```java public class FloydInGraph { private int[][] graph; // 图的邻接矩阵 private int n; // 顶点数量 public FloydInGraph(int[][] ...

    C 代码 实现弗洛伊德算法以查找最短距离 .rar

    在给定的"压缩包子文件的文件名称列表"中提到的"floyd"可能是实现了弗洛伊德算法的源代码文件。打开这个文件,我们可以看到具体的实现细节,包括如何定义图的结构,如何初始化和更新最短路径矩阵,以及如何遍历和...

    C++语言+Floyd算法+DFS等等算法实现校园导游咨询系统

    C语言+弗洛伊德算法+最短路径优先算法实现校园导游咨询 本系统采用Dev C++开发平台来进行编写和测试,用到了类、数组、函数,指针、文件的读取存储操作以及DFS算法和所有顶点对的最短路径(Floyd算法)、 图的各种...

    C语言实现旅游景点咨询系统

    该功能可以通过使用迪杰斯特拉算法(Dijkstra's algorithm)或弗洛伊德算法(Floyd's algorithm)实现。 知识点5:代码实现 本系统的代码实现使用了C语言,包括了图的创建、路径查询、最短路径查询等功能。代码中...

Global site tag (gtag.js) - Google Analytics