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

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

时间:2022-12-07 10:33:05浏览次数:37  
标签:pre int 路径 迪杰 最短 斯特拉 next 输入 dis

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

输入格式:

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

输出格式:

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

输入样例:

在这里给出一组输入。例如:

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

输出样例:

在这里给出相应的输出。例如:

0-->4-->3
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1010;

struct edge{
    int v,w;
    edge* next;
};
struct node{
    int k;
    edge* next;
}a[1010];
int n;

int find(int u){
    for(int i=0;i<n;i++){
        if(a[i].k==u){
            return i;
        }
    }
    return -1;
}

void add(int u,int v,int w){
    edge* e=new edge();
    e->v=v;
    e->w=w;
    e->next=a[u].next;
    a[u].next=e;
}

int dis[N],pre[N];
bool st[N];

void dijkstra(int u){
    memset(pre,-1,sizeof pre);
    memset(dis,0x3f,sizeof dis);
    dis[u]=0;
    for(int i=0;i<n-1;i++){
        int k=-1;
        for(int j=0;j<n;j++){
            if(st[j]==0&&(k==-1||dis[j]<dis[k])){
                k=j;
            }
        }
        if(dis[k]==0x3f3f3f3f){
            continue;
        }
        st[k]=1;
        for(edge* j=a[k].next;j!=NULL;j=j->next){
            int v=j->v,w=j->w;
            if(dis[v]>dis[k]+w){
                dis[v]=dis[k]+w;
                pre[v]=k;
            }
        }
    }
}

void showRoad(int v){
    if(pre[v]!=-1){
        showRoad(pre[v]);
        cout<<"-->"<<a[v].k;
    }else{
        cout<<a[v].k;
    }
}

int main(){
    int m;
    cin>>n>>m;
    
    for(int i=0;i<n;i++){
        int k;
        cin>>k;
        a[i].k=k;
    }
    
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        int uu=find(u),vv=find(v);
        add(uu,vv,w);
    }
    
    int u,v;
    cin>>u>>v;
    dijkstra(u);
    
    showRoad(v);
    
    return 0;
}

标签:pre,int,路径,迪杰,最短,斯特拉,next,输入,dis
From: https://www.cnblogs.com/yitongtianxia666/p/16962343.html

相关文章

  • 最短路
    最短路记号约定\(n\)是点数,\(m\)是边数。\(s\)是源点。\(D\left(u\right)\)是从\(s\)点到\(u\)点的实际最短路,\(D\left(u,v\right)\)是从\(u\)点到\(v\)点的实际最短路......
  • 214. 最短回文串 (JAVA)
    给定一个字符串s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例1:输入:s="aacecaaa"输出:"aaacecaaa"示例2:输......
  • 110002 求最短距离和ABDE四角已知两点坐标
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='求最短距离和AB......
  • 经典算法——最短路径(Floyd+Dijkstra)
    Floyd时间复杂度:O(n^3)简介:作为最短路算法中复杂度最高的算法没有之一,标志性结构三层循环,核心结构本质DP思想具 有动态规划的无后效性他真的没有优点啦?!不,他有!虽然SPF......
  • 最短路算法及其常见扩展应用
    第一节——最短路问题基本概念:由于无向边可以看作两条相反的有向边,于是我们默然按照有向边的形式讨论存图方式:邻接矩阵:空间复杂度\(O(n^2)\),优点:\(O(1)\)查找\(x->y\)......
  • 最短路径Dijkstra算法
    最短路径最短路径的性质:路径是有向的权重不一定等价于距离,权重也可以指时间,花费或者其他并不是所有顶点都是可达的负权重会使得问题更复杂(Dijkstra算法不适用于......
  • Floyd算法(最短路径)
    Floyd算法允许图中有带负权值的边,但不许有包含带负权值的边组成的回路。     上一篇文章我们通过迪杰斯特拉算法解决了从某个源点到其余各顶点的最短路径问题。从循......
  • 最短路好题整理
    [ABC077D]SmallMultiple题意:给定一个整数\(K\)。求一个\(K\)的正整数倍\(S\),使得\(S\)的数位累加和最小。\(2\leK\le{10}^5\)\(K\)是整数。思路只看题......
  • 拓端tecdat|python编程指导使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习
    python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题 在强化学习中,我们有兴趣确定一种最大化获取奖励的策略。假设环境是马尔可......
  • 【算法入门&搜索法】走迷宫|单源最短路径1
    文章目录​​......