#include <iostreamの> する#include <cstdioを> する#include < ストリング > の#include <地図> の#include <CStringの> に#define INF(0x3f3f3f3f) 使用して 名前空間STDを、 CONST INT MAXN = 150 + 15 。 int型グレープ[MAXN] [MAXN]。 マップ < 文字列、int型 > メートル。 int型 D [MAXN]。// sの到每个节点的距离 ブールVIS [MAXN]。 文字列startPos、endposの。 int型のCNT; ボイド ダイクストラ() { memsetの(VIS、偽、はsizeof (VIS))。 memsetの(D、INF、はsizeof (d)参照)。 INT =スタートM [startPos]。 INT端= M [endposの]。// 終了する開始单源最短距离 D [スタート] = 0 ; 一方、(真) { int型 mincost = INF、U = 0 。 用(int型 V = 1 ; V <= CNT ++ V) { 場合(!VIS [V] && D [V] < mincost) { mincost =D [V]。 uが = Vを。 } } もし(mincost == INF) ブレーク。 VIS [U] = 真; 用(int型 V = 1 ; V <= CNT; ++ V) { 場合(VIS [V] && D [U] +グレープ[U] [V] <!D [V]) { D [V] =グレープ[ U] [V] + D [U]。 } } } もし、(D [END] == INF) COUT << " -1 " <<ENDL; 他の COUT << D [終了] << ENDL; } int型)(主// ハッシュは、ブドウが単一始点最短経路を求めて構築された { int型N-、 一方(CIN >> N-N - && =! - 1。 ) { のmemset(ブドウ、INF 、はsizeof(ブドウ)); // INFノードは、UVの代わりに通信しない = CNT 0 ; // 建設S - E双方向図の m.clear(); CIN >> startPosのendposの; M [startPos] = ++ CNT。 M [endposの] = ++ CNT; 列 POS1、POS2。// POS1側からビルドとPOS2する IF(N - == 0 ) { IF(startPosが== endposの) COUT << 0 << ENDL; 他の COUT << - 。1 << ENDL; 続行; } 一方(N-- ) { CIN >> POS1 POS2、 INT U、V; もし(!m.count(POS1)) M [POS1] = CNT ++; // 開始ノードからノードを構築する 場合(!M.count(POS2)) M [POS2] = ++ CNT; U = M [POS1]; V = M [POS2]; int型 W; // エッジ重み値 CIN >> W; グレープ[U] [V]グレープ[V] [U] = = ; W } // 図構築 ダイクストラを(); } }