USACO07FEBシルバーブルパーティ

[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 ;    
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/phemiku/p/11839388.html