zoukankan      html  css  js  c++  java
  • 【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D

    https://vjudge.net/contest/66569#problem/D

    trick:1~N各点到X可以通过转置变为X到1~N各点

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 #include<cmath>
     7 
     8 using namespace std;
     9 const int maxn=1e3+5;
    10 const int inf=0x3f3f3f3f;
    11 int m1[maxn][maxn];
    12 int m2[maxn][maxn];
    13 int n,m,X;
    14 int dis[maxn];
    15 int dis2[maxn];
    16 int d[maxn];
    17 void Dijkstra1()
    18 {
    19     
    20     bool vis[maxn];
    21     memset(dis,inf,sizeof(dis));
    22     dis[X]=0;
    23     memset(vis,0,sizeof(vis));
    24     int v;
    25     for(int i=0;i<n;i++)
    26     {
    27         int m=inf;
    28         for(int k=1;k<=n;k++)
    29         {
    30             if(!vis[k]&&dis[k]<m)
    31             {
    32                 m=dis[k];
    33                 v=k;        
    34             }
    35         }
    36         vis[v]=1;
    37         for(int k=1;k<=n;k++)
    38         {
    39             if(!vis[k]&&m1[v][k]&&dis[v]+m1[v][k]<dis[k])
    40             {
    41                 dis[k]=dis[v]+m1[v][k];
    42             }
    43         }
    44     }
    45 }
    46 
    47 void Dijkstra2()
    48 {
    49 
    50     bool vis[maxn];
    51     memset(dis2,inf,sizeof(dis2));
    52     dis2[X]=0;
    53     memset(vis,0,sizeof(vis));
    54     int v;
    55     for(int i=0;i<n;i++)
    56     {
    57         int m=inf;
    58         for(int k=1;k<=n;k++)
    59         {
    60             if(!vis[k]&&dis2[k]<m)
    61             {
    62                 m=dis2[k];
    63                 v=k;        
    64             }
    65         }
    66         vis[v]=1;
    67         for(int k=1;k<=n;k++)
    68         {
    69             if(!vis[k]&&m2[v][k]&&dis2[v]+m2[v][k]<dis2[k])
    70             {
    71                 dis2[k]=dis2[v]+m2[v][k];
    72             }
    73         }
    74     }
    75 }
    76 
    77 int main()
    78 {
    79     scanf("%d%d%d",&n,&m,&X);
    80     int x,y,w;
    81     for(int i=0;i<m;i++)
    82     {
    83         scanf("%d%d%d",&x,&y,&w);
    84         m1[x][y]=w;
    85         m2[y][x]=w;
    86     }
    87     Dijkstra1();
    88     Dijkstra2();
    89     int ans=0;
    90     for(int i=1;i<=n;i++)
    91     {
    92     //    printf("%d %d
    ",dis[i],dis2[i]);
    93         d[i]=dis[i]+dis2[i];
    94         ans=max(ans,d[i]);
    95     }
    96     printf("%d
    ",ans);
    97     return 0;
    98 }
    Dijkstra
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/itcsl/p/6668677.html
Copyright © 2011-2022 走看看