• Dijkstra算法


    Dijkstra算法

    1.定义概览

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

    问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

    2.算法描述

    1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

    2)算法步骤:

    a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

    b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

    c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

    d.重复步骤b和c直到所有顶点都包含在S中。

    附个代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 const int maxn=99999;
     7 bool visit[101];//判断是否走过 
     8 int dis[101];//记录每条边的长度 
     9 int cmp[101][101],path[101];
    10 int n,m,u,v,h,a,e,k;
    11 int min1; 
    12 
    13 void sc(int s)
    14 {
    15     for(int i=1;i<=n;i++)
    16     {
    17         dis[i]=cmp[s][i];
    18         if(dis[i]!=maxn)//记录路径
    19         path[i]=s;
    20         else
    21         path[i]=0;
    22     }
    23     visit[s]=true;
    24     dis[s]=0;
    25     for(int i=1;i<=n-1;i++)//因为第一个数已确定,所以循环n-1次 
    26     {
    27         min1=maxn;
    28         k=s;
    29         for(int j=1;j<=n;j++)//查找最小值 
    30         {
    31             if(!visit[j]&&dis[j]<min1)
    32             {
    33                 min1=dis[j];
    34                 k=j;
    35             }
    36         }
    37         visit[k]=1;
    38         for(int w=1;w<=n;w++)//寻找最短路径的长度 
    39         {
    40             if(!visit[w]&&dis[w]>cmp[k][w]+dis[k])
    41             {
    42                 dis[w]=cmp[k][w]+dis[k];
    43                 path[w]=k;
    44             }
    45         } 
    46     }
    47     cout<<dis[e]<<endl;//输出最短距离 
    48 }
    49 
    50 void out(int u,int v)
    51 {
    52     int que[101];
    53     int tot=1;
    54     que[tot]=v;
    55     tot++;
    56     int temp=path[v];
    57     while(temp!=u)
    58     {
    59         que[tot]=temp;
    60         tot++;
    61         temp=path[temp];
    62     }
    63     que[tot]=u;
    64     for(int i=tot;i>=1;i--)
    65     {
    66         if(i!=1)
    67         cout<<que[i]<<"-->";
    68         else
    69         cout<<que[i]<<endl;
    70     }
    71 }
    72 
    73 int main()
    74 {
    75     cin>>n>>m;
    76     for(int i=1;i<=m;i++)//初始化
    77        for(int j=1;j<=m;j++)
    78         cmp[i][j]=maxn;
    79         /*memset(cmp,maxn,sizeof(cmp));*/
    80     for(int i=1;i<=m;i++)
    81     {
    82         cin>>u>>v>>h;
    83         cmp[u][v]=cmp[v][u]=h;//无向图,可逆 
    84     }
    85     for(int i=1;i<=m;i++)//初始化
    86         dis[i]=maxn;
    87     cin>>a>>e;
    88     sc(a);
    89     out(a,e);
    90     return 0;
    91 }
  • 相关阅读:
    《DSP using MATLAB》Problem 6.17
    一些老物件
    《DSP using MATLAB》Problem 6.16
    《DSP using MATLAB》Problem 6.15
    《DSP using MATLAB》Problem 6.14
    《DSP using MATLAB》Problem 6.13
    《DSP using MATLAB》Problem 6.12
    《DSP using MATLAB》Problem 6.11
    P1414 又是毕业季II
    Trie树
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6725155.html
Copyright © 2020-2023  润新知