首页 > 编程语言 >12.11 迪杰斯特拉方法实现最短路径(c++)

12.11 迪杰斯特拉方法实现最短路径(c++)

时间:2023-12-12 17:34:50浏览次数:38  
标签:vexnum ShortPathTable int MAX arcs 迪杰 c++ ++ 12.11

  今天通过自主学习,,对数据结构中的迪杰斯特拉方法实现最短路径进行了深造,让我学会了很多新的东西。

首先是问题描述:

用迪杰斯特拉算法实现有向网的最短路径

输入格式:

第一行输入有向网的顶点和边数,第二行输入各顶点值,用空格间隔,第三行开始输入各条边的 两个点的及边上的权值,用空格间隔。最后一行输入要求路径的两个顶点。

输出格式:

输出最短路径经过的各顶点,中间用-->连接。

以下是我解题思路:(c++)

#include <iostream>
#include <limits.h>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
#define MAX_VERTEX_NUM 20
struct Graph {
    int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
    string vexs[MAX_VERTEX_NUM];
    int vexnum, arcnum;
};
int LocateVex(Graph G, string v) {
    for (int i = 0; i < G.vexnum; i++) {
        if (G.vexs[i] == v) {
            return i;
        }
    }
    return -1;
}
void CreateGraph(Graph *G) {
    //cout << "请输入顶点数和弧数: " << endl;
    cin >> G->vexnum >> G->arcnum;
    //cout << "请输入顶点: " << endl;
    for (int i = 0; i < G->vexnum; i++) {
        cin >> G->vexs[i];
        G->arcs[i][i] = 0;
    }
    for (int i = 0; i < G->vexnum; i++) {
        for (int j = 0; j < G->vexnum; j++) {
            if (i != j) {
                G->arcs[i][j] = INT_MAX;
            }
        }
    }
    for (int i = 0; i < G->arcnum; i++) {
        //cout << "请输入边的两个顶点, from v1 to v2: " << endl;
        string v1, v2;
        cin >> v1 >> v2;
        int i1 = LocateVex(*G, v1);
        int i2 = LocateVex(*G, v2);
        //cout << "请输入弧的权值: " << endl;
        cin >> G->arcs[i1][i2];
    }
}
int ShortestPath_DIJ(Graph G) {
    //cout << "请输入想查询到其他点最短距离的起点: " << endl;
    string s0;
    string s1;
    cin >> s0;
    cin >> s1;

    int v0 = LocateVex(G, s0);
    int v1 = LocateVex(G, s1);

    const int num = G.vexnum;
    int flag_1=0;
    int flag_2=0;
    /*for (int i = 0; i < num; i++)
    {

        //cout<<G.vexs[i]<<endl;
        if (s0==G.vexs[i]) {
        flag_1=1;
    }
       if (s1==G.vexs[i])
      {
        flag_2=1;
      }
      if((flag_1!=flag_2)||(flag_1==0&&flag_2==0)){
        cout << "error" << endl;
        return -1;
      }
    }*/
    vector<int> path[num];
    int ShortPathTable[num];
    bool final[num];
    for (int i = 0; i < G.vexnum; i++) {
        final[i] = false;
        ShortPathTable[i] = G.arcs[v0][i];
        if (ShortPathTable[i] < INT_MAX) {
            path[i].push_back(v0);
            path[i].push_back(i);
        }
    }
    ShortPathTable[v0] = 0;
    final[v0] = true;
    for (int i = 1; i < G.vexnum; i++) {
        int min = INT_MAX;
        int v = 0;
        for (int w = 0; w < G.vexnum; w++) {
            if (!final[w]) {
                if (ShortPathTable[w] < min) {
                    min = ShortPathTable[w];
                    v = w;
                }
            }
        }
        final[v] = true;
        for (int w = 0; w < G.vexnum; w++) {
            if (!final[w] && G.arcs[v][w] < INT_MAX && min + G.arcs[v][w] < ShortPathTable[w]) {
                ShortPathTable[w] = min + G.arcs[v][w];
                path[w].clear();
                path[w] = path[v];
                path[w].push_back(w);
            }
        }
    }
    //for (int i = 0; i < num; i++)
     {
         int i=v1;
        if (i != v0) {
                // cout<<1<<endl;
            if (ShortPathTable[i] == INT_MAX) {
                cout << "从源点" << G.vexs[v0] << "到终点" << G.vexs[i] << "不可达!" << endl;
            }
            else {

                //cout << "从源点" << G.vexs[v0] << "到终点" << G.vexs[i] << "的最短路径: " << endl;
                cout << G.vexs[path[i][0]];
                for (int j = 1; j < path[i].size(); j++) {
                   // if(j==v1)
                    cout << "-->" << G.vexs[path[i][j]];
                }
                cout << endl;
                //cout << "其最短长度为: " << endl;
                //cout << ShortPathTable[i] << endl;
            }
            //cout << "----------------------------------" << endl;
        }
    }
    return 1;
}
int main () {
    Graph G;
    CreateGraph(&G);
    ShortestPath_DIJ(G);
    return 0;
}

 

标签:vexnum,ShortPathTable,int,MAX,arcs,迪杰,c++,++,12.11
From: https://www.cnblogs.com/tianpeisen/p/17897387.html

相关文章

  • C++ Qt开发:SpinBox数值微调框组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSpinBox精度数值组件的常用方法及灵活运用。QSpinBox是Qt框架中的一个部件(Widget),用于提供一个方......
  • 学习C++算法入门第二天
    头文件#include<iostream> i=input,o=outputusingnamespacestd;头文件函数:https://blog.csdn.net/qq_32699009/article/details/104615792参考这个HelloWorld!---C学过,第一次接触C++,开启新的语言学习cin>>输入;cout<<输出<<endl; 啥是闰年?---非整百年:能被4整除的为闰......
  • 云原生周刊:Kubernetes v1.29 新特性一览 | 2023.12.11
    开源项目推荐kubedogKubedog是一个用于在CI/CD部署管道中监视和跟踪Kubernetes资源的库。这个库被用于werfCI/CD工具中,在部署过程中跟踪资源。RunWhenLocalrunwhen-local是一个工具,用于在本地环境中运行runwhen脚本。runwhen是一个灵活的任务调度工具,可以根据条......
  • C++语言string、wstring、utf-8互转
    实现了一个CStrCvt类,采用STL实现,可跨平台。注意的是,在s2ws和ws2s函数中需要locale信息,在使用过程中,需要根据实际情况进行设置。如果有需要可以检测文本编码,网上有开源的第三方库,可供使用。不过,准确率需自己判断。为了不影响效率,此类默认按照中文处理。头文件classCStrCvt{pu......
  • 算法战斗第一天C++1
    A.Watermelon西瓜(timelimitpertest:1second,memorylimitpertest:64megabytes,input:standardinput,output:standardoutput)OnehotsummerdayPeteandhisfriendBillydecidedtobuyawatermelon.Theychosethebiggestandtheripest熟one,int......
  • 在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义
    在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义。以下是一些常见的符号:#:字符串化运算符,用于将宏参数转换为字符串。#defineSTRINGIZE(x)#xstd::cout<<STRINGIZE(Hello);//输出"Hello"##:连接运算符,用于连接两个标记,使它们成为一个标记。#de......
  • C++调用opencv和windows api完成桌面窗口截图——以梦幻西游为例
    目录程序简介程序/数据集下载代码环境、文件结构代码分析结果展示程序简介项目编写的C++程序,根据输入的字符串,遍历所有桌面窗口标题,查找包含该标题的窗口,对该桌面窗口进行截图,以梦幻西游为例输入:桌面窗口包含的字符串比如输入“梦幻”,程序就会截取桌面“梦幻西游”的窗口输......
  • C++ 用 std::get<> 访问元组
     C++ 用std::get<>访问元组 #include<iostream>#include<tuple>intmain(){//Creatingatuplestd::tuple<int,double,std::string>myTuple(42,3.14,"Hello");//Accessingelementsusingstd::get<>......
  • C++(using namespace std;)
    usingnamespacestd;是C++中的一条指令,用于指示编译器使用标准命名空间std中的所有标识符。这意味着在代码中可以直接使用标准库中的各种类、函数和对象,而无需在每个标识符前面添加std::前缀。以下是关于这条指令的一些解释:using关键字:using是一个关键字,用于创建别......
  • C++连点器
     功能这个连点器可以提升你的CPS值,它可以让你的每一次点击变成好多次,左键右键均可。 要求它调用了"windos.h"函数库(Windows系统自带函数库)以及"bits/stdc++.h"函数库(C++拓展函数),若无法使用"bits.stdc++.h"函数库的,可以将其替换为"iostream.h"函数库和"cstdio.h"......