二つのダイクストラテンプレートのタイトル

ノード番号をマッピングすることで// 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を返します。
}

おすすめ

転載: www.cnblogs.com/pupil-xj/p/11564176.html