(邻接表)最短路径算法

Posted xusi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(邻接表)最短路径算法相关的知识,希望对你有一定的参考价值。

Dijktra算法:

思想:找到距离原点最近的一个顶点,然后以该点为中心进行扩展,最终得到源点到其余各点的最短路径。

缺点:无法解决带负边的图论问题。

输入样例:

6 9 1 (6个点 9条边 起点为1)
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

输出样例:

0 1 8 4 13 17 (源点到各点的最短距离)

#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <math.h>
#include <vector>
using namespace std;
const int inf=999999;//0x7fffff
const long long mod=1e9+7;
const double PI=acos(-1);

int n,m;
int ans=9999999;
bool vis[105];
int dis[105];

struct node{
    int u;
    int w;
    node(int uu,int ww){
        u=uu;
        w=ww;
    }
};
vector<node> v[105]; 
void Dijkstra(int s){                        //Dijkstra算法为单源最短路径算法 s 为起点 
    memset(dis,inf,sizeof(dis));             //dis数组表示起点 s 到每个点的最小路径 
    vis[s]=1;
    dis[s]=0;  
    for(int i=0;i<v[s].size();i++){         //初始dis最短路径表 
        node no = v[s][i];
        dis[no.u]=no.w;
    }
    
    int min,minp;
    for(int i=1;i<=n;i++){                 //遍历dis数组的每一个最短路径 
        min=inf;
        for(int j=1;j<=n;j++){
            if(!vis[j]&&dis[j]<min){       //寻找并记录此时dis表的最短路径的值和距离 
                min=dis[j];
                minp=j;
            }
        }
        vis[minp]=1;
        for(int u=0;u<v[minp].size();u++){ //寻找此时最短路径的点可到的点 并更新该点的最短路径 
            node no=v[minp][u]; 
            if(!vis[no.u]&&dis[no.u]>dis[minp]+no.w){
                dis[no.u]=dis[minp]+no.w;
            }
        }
    }
}
int main()
{
    int x,y,value,s;
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++){
        dis[i]=inf;
    }
    for(int i=0;i<m;i++){
        cin>>x>>y>>value;
        v[x].push_back(node(y,value));
    }
    Dijkstra(s);                        //s 为起点 
    for(int i=1;i<=n;i++){              //输出s 到各个点的最短路径 
        cout<<dis[i]<<" ";
    }
    return 0;
}

 

以上是关于(邻接表)最短路径算法的主要内容,如果未能解决你的问题,请参考以下文章

最短路径

最短路径

用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径

每日算法图算法(遍历&MST&最短路径&拓扑排序)

最短路径(邻接矩阵)-Dijkstra算法

数据结构与算法图最短路径算法 ( Floyed 算法 | 图最短路径算法使用场景 | 求解图中任意两个点之间的最短路径 | 邻接矩阵存储图数据 | 弗洛伊德算法总结 )