zoukankan      html  css  js  c++  java
  • 图论-最短路径 2.Dijkstra算法O (N2)

    2.Dijkstra算法O (N2)
    用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况
    Dijkstra的时间复杂度是O (N2),它不能处理存在负边权的情况
    算法描述:
           设起点为sdis[v]表示从sv的最短路径,pre[v]v的前驱节点,用来输出路径。
           a)初始化:dis[v]=(vs); dis[s]=0; pre[s]=0;
           b)For (i = 1; i <= n ; i++)
                1.在没有被访问过的点中找一个顶点u使得dis[u]是最小的。
                2.u标记为已确定最短路径
                3.For u相连的每个未确定最短路径的顶点v
                  if  (dis[u]+w[u][v]<dis[v])
                   {
                      dis[v]=dis[u]+w[u][v];
                      pre[v]=u;
                   }
            c)算法结束:dis[v]sv的最短距离;pre[v]v的前驱节点,用来输出路径。
     1 #include<cstdio>
     2 #include<cstring>
     3 #define N 1010
     4 #define MAXX 9999999
     5 int dis[N];
     6 int map[N][N];
     7 int qq[N];
     8 int que[N];
     9 int n,m,bein,s,ss;
    10 int visit[N];
    11 void work(int s)
    12 {
    13     visit[s]=1;
    14     for(int k=1;k<=n;++k)
    15     {
    16         dis[k]=map[s][k];
    17         if(map[s][k]!=MAXX)qq[k]=s;
    18         else qq[k]=0;
    19     }
    20     visit[s]=1;
    21     dis[s]=0;
    22     for(int I=1;I<n;++I)
    23     {
    24         int k=s,minn=MAXX;
    25         for(int j=1;j<=n;++j)
    26         {        
    27             if(!visit[j]&&dis[j]<minn)
    28             {
    29                 minn=dis[j];
    30                 k=j;
    31             }
    32         }
    33         visit[k]=1;
    34         for(int i=1;i<=n;++i)
    35         {
    36             if(map[k][i]&&!visit[i]&&dis[i]>dis[k]+map[k][i])
    37             {
    38                 dis[i]=dis[k]+map[k][i];
    39                 qq[i]=k;
    40             }
    41         }
    42     }
    43     printf("%d
    ",dis[ss]);
    44 }
    45 void print (int u,int v    ) 
    46 {
    47     int tot=1;
    48     que[tot]=v;
    49     tot++;
    50     int temp=qq[v];
    51     while(temp!=u)
    52       {    que[tot]=temp;
    53         tot++;
    54         temp=qq[temp];
    55       }
    56     que[tot]=u;
    57     for(int i=tot;i>=1;i--)
    58          if(i!=1)
    59              printf("%d->",que[i]);
    60          else
    61              printf("%d",que[i]);
    62 
    63 }
    64 int main()
    65 {    
    66     scanf("%d%d",&n,&m);
    67     memset(dis,MAXX,sizeof(dis));
    68     memset(map,MAXX,sizeof(map));
    69     for(int i=1;i<=m;++i)
    70     {
    71         int x,y,q;
    72         scanf("%d%d%d",&x,&y,&q);
    73         map[x][y]=q;
    74         map[y][x]=q;    
    75     }
    76     scanf("%d%d",&s,&ss);
    77     work(s);
    78     print(s,ss);
    79     return 0;
    80 }
  • 相关阅读:
    list 集合工具类
    Java获取当前系统时间的前N小时时间
    注意点
    小bug
    Linux常用命令
    MySql的执行计划
    【解决问题】引入.vmx文件后,xshell连接Could not connect to ‘192.168.211.132‘ (port 22): Connection failed
    星涛:javaEE学习路线一览
    Vue响应式原理
    Java操作Xml文件
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6686148.html
Copyright © 2011-2022 走看看