zoukankan      html  css  js  c++  java
  • kuangbin专题最短路 D

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iomanip>
     5 #include<cmath>
     6 #include<cstdio>
     7 using namespace std;
     8 #define MAXN 1004
     9 #define INF 0x3f3f3f3f
    10 /*
    11 18 08
    12 18 23
    13 超时
    14 18 24
    15 18 33 
    16 超时
    17 18 41 AC
    18 有向图,所有结点中到终点来回距离的最大值
    19 对每个节点求最短路得到to[MAXN],对终点求最短路的back[MAXN]
    20 n3!超时!
    21 只需将有向图反转一次(有向路径反向),对终点求两次Dijk即可
    22 max(to+back)
    23 */
    24 bool been[MAXN];
    25 int lowcost[MAXN],g[MAXN][MAXN],m,n,x,ans=-1;
    26 int to[MAXN],back[MAXN];
    27 void Read()
    28 {
    29     int x,y,d;
    30     for(int i=0;i<m;i++)
    31     {
    32         scanf("%d%d%d",&x,&y,&d);
    33         g[x][y] = d;
    34     }
    35 }
    36 void Init()
    37 {
    38     memset(lowcost,INF,sizeof(lowcost));
    39     memset(been,false,sizeof(been));
    40 }
    41 void Dijkstra(int beg,int tmp[])
    42 {
    43     Init();
    44     lowcost[beg] = 0;
    45     for(int j=0;j<n;j++)
    46     {
    47         int Min = INF,k = -1;
    48         for(int i=1;i<=n;i++)
    49         {
    50             if(!been[i]&&lowcost[i]<Min)
    51             {
    52                 Min = lowcost[i];
    53                 k = i;
    54             }
    55         }
    56         if(k==-1) break;
    57         been[k] = true;
    58         for(int i=1;i<=n;i++)
    59         {
    60             if(!been[i]&&lowcost[i]>lowcost[k]+g[k][i])
    61             {
    62                 lowcost[i] = lowcost[k]+g[k][i];
    63             }
    64         }
    65     }
    66     for(int i=1;i<=n;i++)
    67     {
    68         if(i==beg) continue;
    69         tmp[i] = lowcost[i];
    70     }
    71 }
    72 int main()
    73 {
    74     scanf("%d%d%d",&n,&m,&x);
    75     memset(g,INF,sizeof(g));
    76     Read();
    77     Dijkstra(x,back);
    78     for(int i=1;i<=n;i++)
    79     {
    80         for(int j=i+1;j<=n;j++)
    81         {
    82             int t = g[i][j];
    83             g[i][j] = g[j][i];
    84             g[j][i] = t;
    85         }
    86     }
    87     Dijkstra(x,to);
    88     for(int i=1;i<=n;i++)
    89     {
    90         ans = max(ans,back[i]+to[i]);
    91     }
    92     printf("%d
    ",ans);
    93     return 0;
    94 }
  • 相关阅读:
    day59_BOS项目_11
    day58_BOS项目_10
    shell 笔记
    docker + swarm 集群
    HDFS深入浅析
    FTP服务器常规操作
    linux shell 流程控制
    认识黑客常用的入侵方法
    Linux中常用的查看系统信息的命令
    解决Yum安装依赖问题
  • 原文地址:https://www.cnblogs.com/joeylee97/p/6555778.html
Copyright © 2011-2022 走看看