首页 > 编程语言 >6-2 最短路径(迪杰斯特拉算法)

6-2 最短路径(迪杰斯特拉算法)

时间:2023-06-26 22:38:00浏览次数:37  
标签:vexnum AMGraph int 迪杰 MVNum 最短 start num 斯特拉

试实现迪杰斯特拉最短路径算法。

函数接口定义:

 
void ShortestPath_DIJ(AMGraph G, int v0);
 

其中 G 是基于邻接矩阵存储表示的有向图, v0表示源点

裁判测试程序样例:

 
#include <iostream>
using namespace std;

#define MaxInt 32767
#define MVNum 100 
typedef char VerTexType;
typedef int ArcType;

int *D=new int[MVNum];
bool *S=new bool[MVNum];
int *Path=new int[MVNum];

typedef struct{ 
    VerTexType vexs[MVNum]; 
    ArcType arcs[MVNum][MVNum]; 
    int vexnum,arcnum;
}AMGraph;

void CreateUDN(AMGraph &G){ 
    int i , j , k;
    cin >> G.vexnum >> G.arcnum;

    for(i = 0; i < G.vexnum; ++i){   
        cin >> G.vexs[i];       
    }

    for(i = 0; i < G.vexnum; ++i)            
        for(j = 0; j < G.vexnum; ++j)   
            G.arcs[i][j] = MaxInt;  

    for(k = 0; k < G.arcnum;++k){                            
        VerTexType v1 , v2;
        ArcType w;
        cin >> v1 >> v2 >> w;                                
        i = LocateVex(G, v1);  
        j = LocateVex(G, v2);        
        G.arcs[i][j] = w;                                    
        G.arcs[j][i] = G.arcs[i][j];                         
    }
}

void ShortestPath_DIJ(AMGraph G, int v0);

void DisplayPath(AMGraph G , int begin ,int temp ){
    if(Path[temp] != -1){
        DisplayPath(G , begin ,Path[temp]);
        cout << G.vexs[Path[temp]] << "->";
    }
}

int main()
{
    AMGraph G; 
    int i , j ,num_start , num_destination;
    VerTexType start , destination;
    CreateUDN(G);
    cin >> start >> destination;
    num_start = LocateVex(G , start);
    num_destination = LocateVex(G , destination);
    ShortestPath_DIJ(G , num_start);
    DisplayPath(G , num_start , num_destination);
    cout << G.vexs[num_destination]<<endl;
    return 0;
}
/* 请在这里填写答案 */
 

输入样例:

第1行输入结点数vexnum和边数arcnum。第2行输入vexnum个字符表示结点的值,接下来依次输入arcnum行,每行输入3个值,前两个字符表示结点,后一个数表示两个结点之间边的权值。最后一行输入源点及终点。

6 8
012345
0 5 100
0 2 10
0 4 30
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
0 5
 

输出样例:

输出源点到终点的最短路径。

0->4->3->5
 

hh.png

void ShortestPath_DIJ(AMGraph G, int v0){
    int v,i,j,min;
    int n=G.vexnum;
   for(v=0;v<n;v++)
   {
       S[v]=false;//标记是否被访问
       D[v]=G.arcs[v0][v];//存储权值
       if(D[v]<MaxInt)Path[v]=v0;
       else Path[v]=-1;
   }
    S[v0]=true;
    D[v0]=0;//初始化S,D数组
    for(i=0;i<n-1;i++)
    {
        min=MaxInt;
        for(j=0;j<n;++j)
        {
            if(D[j]<min&&!S[j])
            {
                v=j;
                min=D[j];//在未被访问的点中寻找权值最小的
            }
        }
        S[v]=true;
        for(j=0;j<n;++j)
        {
            if(!S[j]&&(D[j]>D[v]+G.arcs[v][j]))
            {
                D[j]=D[v]+G.arcs[v][j];//更新数组D
                Path[j]=v;
            }
        }
    }
}

 

标签:vexnum,AMGraph,int,迪杰,MVNum,最短,start,num,斯特拉
From: https://www.cnblogs.com/xiao-hong111/p/17506906.html

相关文章

  • 最短路算法
    目录最短路算法单源最短路-迪杰斯特拉算法最短路算法单源最短路-迪杰斯特拉算法用于计算一个节点到其他所有节点的最短路径Dijkstra算法是贪心算法,是一种求解非负权图上单源最短路径的算法。基本思想是:设置一个顶点的集合S,并不断地扩充这个集合,当且仅当从源点到某个点的路......
  • abc061d <单源最短路, spfa, 判断负环>
    D-ScoreAttack//https://atcoder.jp/contests/abc061/tasks/abc061_d//单源最短(长)路,spfa,判断负(正)环//本题是找最长的路径,实际上取个负号即可//注意,找到一个负环不能直接结束,只能进行标记cyc[]#include<iostream>#include<algorithm>#include<vect......
  • 2023年春招必备-LeetCode刷题笔记最短最优雅经验整理分享
        本资源将根据LeetCode中文版探索板块给出的路线制作题解,各专栏将尽力覆盖各大知识要点并总结知识点和套路。相比于题库解析部分追求代码的绝对精简,本专题追求以高可读性呈现各大专题的常规思路,为后续的题库解析部分做铺垫。俩部分题目可能重复,但专题部分会有更详细的解析......
  • #yyds干货盘点# LeetCode程序员面试金典:最短回文串
    1.简述:给定一个字符串s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例1:输入:s="aacecaaa"输出:"aaacecaaa"示例2:输入:s="abcd"输出:"dcbabcd"2.代码实现:classSolution{publicStringshortestPalindrome(Strings)......
  • 聊一聊多源最短路径问题(只有5行代码哦)
    暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之......
  • NC23482 小A的最短路
    题目链接题目题目描述小A这次来到一个景区去旅游,景区里面有N个景点,景点之间有N-1条路径。小A从当前的一个景点移动到下一个景点需要消耗一点的体力值。但是景区里面有两个景点比较特殊,它们之间是可以直接坐观光缆车通过,不需要消耗体力值。而小A不想走太多的路,所以他希望你能够......
  • abc051 <多源最短路>
    https://atcoder.jp/contests/abc051/tasks/abc051_d//https://atcoder.jp/contests/abc051/tasks/abc051_d//一条边不含于任何一条最短路中,当且仅当w[i][j]>dist[i][j],即存在一条最短路的权比这条边的权小#include<iostream>#include<algorithm>#include<cstrin......
  • 6-3 最短路径(弗洛伊德算法)
    #include<iostream>usingnamespacestd;#defineMaxInt32767#defineMVNum100typedefcharVerTexType;typedefintArcType;intPath[MVNum][MVNum];//标志两个结点之间是否可达intD[MVNum][MVNum];//存储两个结点间的边的权重typedefstruct{VerTexT......
  • 路径计数 6.20西安集训(最短哈密顿回路条数)
     因为是哈密顿回路,所以每个点度数为2假设我们已经考虑了i个点,其中b个B,w个W。若存在x条由{1,2,...n}连向{i+1,...2n},那么{1...n}内部的连边数为(2*i-x)/2而只有不同颜色的点会连边,故(2*i-x)/2<=2*min(w,b)x>=2(w+b)-4min(w,b)=2|w-b|则x>=2max(1,|w-b|).为了求得最短路,我们肯定......
  • P3371 【模板】单源最短路径(弱化版)(C++_SPFA算法_链式向前星)
    题目背景本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步P4779。题目描述如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。输入格式第一行包含三个整数n,m,s,分别表示点的个数、有向边的个数、出发点的编号。接下来m行每行包含三个......