首页 > 其他分享 >迪杰斯特拉方法实现最短路径

迪杰斯特拉方法实现最短路径

时间:2022-12-23 21:12:30浏览次数:34  
标签:vexnum ShortPathTable int MAX arcs 迪杰 最短 ++ 斯特拉

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

输入格式:

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

输出格式:

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

代码如下:

#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,迪杰,最短,++,斯特拉
From: https://www.cnblogs.com/psh888/p/17001636.html

相关文章

  • 迪杰斯特拉方法实现最短路径
    用迪杰斯特拉算法实现有向网的最短路径输入格式:第一行输入有向网的顶点和边数,第二行输入各顶点值,用空格间隔,第三行开始输入各条边的两个点的及边上的权值,用空格间隔。......
  • python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题|附代码数据
    原文链接:http://tecdat.cn/?p=11105最近我们被客户要求撰写关于MDP的研究报告,包括一些图形和统计输出。在强化学习中,我们有兴趣确定一种最大化获取奖励的策略。假设环境......
  • 力扣-581-最短无序连续子序列
    能不能把问题转化为找第一个逆序对和最后一个逆序对 intfindUnsortedSubarray(vector<int>&nums){ intres=0; intstartIndex=-1,endIndex=-1; for(inti=......
  • déce. 20 最短网络
    https://www.luogu.com.cn/problem/P1546一遍过#include<bits/stdc++.h>usingnamespacestd;#defineinRead()typedeflonglongll;intin{inti=0,f=1;ch......
  • [ARC044B] 最短路問題
    [ARC044B]最短路問題难度:\(1744\)标签:最短路,记数\(\mathtt{blog}\)有一个\(n\)个点的无向图,\(1\)点为起点,现在告诉你\(1\simn\)点到\(1\)点的最短距离,每条边......
  • dijkstra最短路代码模板更新
     fromcollectionsimportdefaultdictfromheapqimportheappush,heappopdefdijkstra(edges,start_node,end_node):graph=defaultdict(dict)f......
  • e^x 与 ln x 的 最短距离 是 多少 ?
    下午 7点左右,  在知乎看到一题 :   e^x与 lnx 的最短距离是多少? 在消息通知里看到,  没有看到解题过程,  看到这题是高考难度, ......
  • [Code+#4]最短路
    [\(Code\)+#4]最短路链接:https://www.luogu.com.cn/problem/P4366题面:给定一个\(n\)个点,\(m\)条边的无向图,若任意点对\((i,j)\)之间还有一条长为\((ixorj)\timesC\)......
  • [Code+#4]最短路
    [$Code$+#4]最短路链接:https://www.luogu.com.cn/problem/P4366题面:给定一个$n$个点,$m$条边的无向图,若任意点对$(i,j)$之间还有一条长为$(ixorj)\timesC$的边,求$A......
  • PWN ORW 最短的shellcode(33字节!)
    前言:下面的rdx就是read(1,buf,n)中的n,这个值太大或者太小都没办法正常读。所以分两种大情况:orw:(64bit,34字节,针对需要调整rdx的情况:)shellcode=asm('''movedx,0x6761......