ノード番号をマッピングすることで// hdu2112マップ
//リンクhttp://acm.hdu.edu.cn/showproblem.php?pid=2112
書式#include <cstdioを>
書式#include <iostreamの>
書式#include <文字列>
書式#include <CStringの>
書式#include <マップ>
名前空間stdを使用。
const int型INF = 0x3f3f3f3f。
const int型MAXN = 150 + 15。
文字列S、E。
マップの<string、int型> discnt。
int型のCNT;
INT G [MAXN] [MAXN]。
INT DIS [MAXN]。
int型ネジ[MAXN]。
ボイドダイクストラ(){
{(S == e)の場合
printf( "0 \ N");
返します。
}
{(;; I = CNT!++ iは0 = INT)について
DIS [I] = G [discnt [S] [I]。
[I] = 0図です。
}
VIS [discnt [S] = 1。
以下のために(INT i = 0;!I = CNT-1; ++ I){
= INFからあなた。
int型、T = -1;
{(!;; J = CNT ++ J int型J = 0)について
(もし!VIS [J] && DIS [J] <ミネソタ州){
DISによる= [J]。
T = J;
}
}
(T == -1)ブレークであれば、
力[I] = 1。
{(!;; J = CNT ++ J int型J = 0)について
IF(DIS [J]> DIS [T] + G [t]は[J]){
[j]を伝える= [T] + G [T] [j]を言います。
}
}
}
もし(DIS [discnt [E] = INF!)のprintf( "%dは\ nを"、DIS [discnt [E]]);
他のprintf( " - 1つの\ N");
}
{int型のmain()
int型のn;
一方、(scanf関数( "%のD"、&N)== 1 && N!= -1){
memsetの(G、INF、はsizeof(G))。
CIN >> S >> E。
文字列、B;
discnt.clear();
CNT = 0;
[A] = ++ CNT discnt。
discnt [B] = ++ CNT。
int型のC;
{(;; I = N!++ iが0 = INT)について
CIN >> A >> B >> C。
(!discnt.count(A))の場合discnt [A] = CNT ++;
(!discnt.count(B))であればdiscnt [B] = CNT ++;
IF(C <G [discnt []] [discnt [B]]){
G [discnt []] [discnt [B] = G [discnt [B] [discnt []] = Cを、
}
}
ダイクストラ();
}
0を返します。
}
// ------------------行を分割---------------------------- --------------------
// PAT(上級レベル)Practice-> 1030年、レコード・パス
書式#include <iostreamの>
書式#include <cstdioを>
書式#include <CStringの>
名前空間stdを使用。
#define INF 0x3f3f3f3f
#define MAX 502
整数N、M、S、D。
INTのMP [MAX] [MAX]、コスト[MAX] [MAX]。
INTパス[MAX]、VIS [MAX]。
[MAX] DIS INT、[MAX] mincost。
ボイドDijkstar(){
{(;; I = N!++ iは0 = INT)について
DIS [I] =融点[S] [I]。
mincost [I] =コスト[S] [I]。
パスは、[I]は= Sは; //ノードに記録されています
}
[S] = 1;
{(; iがN-1 <++ iが0 = INT)のために
INT M = INF、m_c = INF。
int型のトン。
(int型J = 0; J = N;!++ j)のための{
(もし!VIS [J] &&メートル> DIS [J]){
M = [j]を言います。
m_c = mincost [J]。
T = J;
}
}
力[I] = 1。
(int型J = 0; J = N;!++ j)のための{
(もし!VIS [J]){
IF(DIS [J]> MP [T] [J] + M){
DIS [J] =融点[T] [J] +、M。
mincost [J] =コスト[T] [J] + m_c。
パス[j]は、Tを=。
}
そうであれば(DIS [J] == MP [T] [J] + M && mincost [J]>コスト[T] [J] + m_c){
DIS [J] =融点[T] [J] +、M。
mincost [J] =コスト[T] [J] + m_c。
パス[j]は、Tを=。
}
}
}
}
INTインデックス= D、トップ= 0。
int型のスタック[MAX];
しばらく(インデックス!= S){
[トップ++] =インデックスをスタック。
インデックス=パス[インデックス]。
}
coutの<< S << "「;
上 - ;
一方、(TOP> = 0){
coutの<< [top--] << "「スタック。
}
COUT << DIS [D] << "" << mincost [D] << ENDL。
}
メインint型()
{
CIN >> N >> M >> S >> D。
memset(MP、0x3fを、はsizeof(MP))。
memsetの(コスト、0x3fを、はsizeof(コスト));
memsetの(VIS、0、はsizeof(VIS))。
A、B、S、Cのint;
以下のために(私は0 = int型;!I = M; ++ I){
scanf関数( "%D%D%D%D"、&、&B、&S&C)。
IF(S <MP [A] [B] ||(S == MP [A] [B] && C <コスト[A] [B])){
mp[a][b] = mp[b][a] = s;
コスト[A] [B] =コスト[B] [A] = Cを、
}
}
ダイクスター();
0を返します。
}