[N]イタリアおよびMポイントが単一始点最短最長の往復距離を求めて、エッジを向けていること
【解決】ビルド二つのグラフ
蘭二回spfa
ただし、注意が必要な多くの詳細があります
#include <ビット/ STDC ++ H> のconst int型 N = 1005 。 構造体ノード{ int型、W、V、。 }。 std ::ベクトル <ノード> G [ 3 ] [N]。 std ::キュー < 整数 > Q; INT、N、K、M、X、Y、Z、HS、VIS [N]、F [ 3 ] [N]、ANS = - 0x3f3f 。 ボイド spfa(int型K){ memsetの(VIS、0、はsizeof VIS)。 VIS [HS] = 1 。 F [K] [HS] = 0 ; q.push(HS)。 同時に(!q.empty()){ int型のu = q.front(); q.pop(); VIS [U] = 0 ; // はstd :: coutの<< "DEBUG!" << G [k]が[U] .size(); 以下のために(INT iが= 0 ; I <G [K] [U] .size(); ++ I){ int型、V = G [K] [U] [I] .V、W = G [K] [Uを] [i]は.W。 もし(F [K] [V]> F [K] [U] + W){ F [k]は[V] = F [K] [U] + W。 もし(!VIS [V]){ VIS [V] = 1 。 q.push(V); } } } } } int型のmain(){ scanf関数(" %D%D%D "、&N、&M、&HS)。 memsetの(F、0x3f3f3f、はsizeof (F))。 用(登録をint iは= 1 ; I <= M ++ {I) のscanf(" %D%D%D "、およびX&Y、およびZ)。 G [ 1 ] [X] .push_back((ノード){Y、Z})。 G [ 2 ] [Y] .push_back((ノード){X、Z})。 } spfa(1 )。 spfa(2 )。 ために(登録int型私は= 1 ; I <= N。++ I){ 場合(I == HS)を続けます。 ANS = STD :: MAX(ANS、F [ 1 ] [I] + F [ 2 ] [I])。 } のprintf(" %dの" 、ANS)。 リターン 0 ; }