• 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 }
  • 相关阅读:
    「学习笔记」min_25筛
    HNOI2019游记
    【SDOI2017】数字表格
    【APIO2016】烟火表演
    【SCOI2015】小凸想跑步
    java Thread源码分析
    java ThreadGroup源码分析
    bean获取Spring容器
    spring 管理bean
    thinkphp5.0.19 request
  • 原文地址:https://www.cnblogs.com/joeylee97/p/6555778.html
Copyright © 2020-2023  润新知