두 익스트라 템플릿 제목

노드 번호를 매핑하여 // hdu2112지도

// 링크 http://acm.hdu.edu.cn/showproblem.php?pid=2112

#INCLUDE <cstdio>
사용법 #include <iostream>
사용법 #include <문자열>
#INCLUDE <CString을>
사용법 #include <지도>
네임 스페이스를 사용하여 표준;

INF = CONST INT 0x3f3f3f3f;
CONST의 INT의 MAXN = 150 + 15;

문자열 S, E;
지도 <문자열, INT> discnt;

INT의 CNT;
INT G [MAXN] MAXN];

INT DIS [MAXN];
INT 나사 [MAXN];
() {익스트라 무효화
    {(S == 전자 있으면)
        의 printf ( "0 \ n");
        반환;
    }
    위한 (! = I (CNT), I = 0을 int로 I ++) {
        DIS [I] = G [discnt의 [S] [I];
        뷰 [I] = 0;
    }
    힘 [discnt의 [S] = 1;
    대해 INT (I = 0;! I = CNT-1; I ++) {
        = INF에서 당신;
        INT t = -1;
        대 (INT의 J = 0; J = CNT;! J ++) {
            만약 (! 힘 [J] && DIS [J] <미네소타) {
                DIS = [J]에 의해;
                t = J;
            }
        }
        (t == -1) 어기면;
        힘 [I] = 1;
        대 (INT의 J = 0; J = CNT;! J ++) {
            경우 (DIS [J]> DIS [t] + G [t] [J]) {
                말할 [J] = 대답 [t] + G [t] [J];
            }
        }
    }
    경우 (DIS [discnt [E] = INF!)의 printf ( "% D \ 없음"DIS [discnt [E]);
    다른 사람의 printf ( "- 1 \ n");
}

() {int로 메인
    INT 않음;
    반면 (는 scanf ( "%의 D", N) == 1 && N! = -1) {
        memset 함수 (G, INF,는 sizeof (G));
        CIN >> >> S E;
        캐릭터 A, B;
        discnt.clear ();
        CNT = 0;
        discnt [A] = CNT ++;
        discnt [B] = CNT ++;
        INT의 C;
        대해 INT (I = 0; I = N;! I ++) {
            CIN 사항 >> >> >> B C;
            (! discnt.count (a))의 경우 discnt [A] = CNT ++;
            (! discnt.count (b)) 경우 discnt [B] = CNT ++;
            경우 (c <G [discnt [A] [discnt [B]) {
                G [discnt [A] = G [discnt [A]의 (C) = [discnt [] B] [] B discnt [];
            }
        }
        다 익스트라 ();
    }
    0을 반환;
}
 
// ------------------ 분할 선 ---------------------------- -------------------- 
 
// PAT (고급 수준)하여 연습> 1030 레코드 경로
사용법 #include <iostream>
#INCLUDE <cstdio>
#INCLUDE <CString을>
네임 스페이스를 사용하여 표준;

#DEFINE INF 0x3f3f3f3f
#DEFINE MAX (502)
INT N, M, S, D;
INT의 MP [MAX] MAX] 선정 [MAX] MAX];
INT 경로 [MAX] 힘 [MAX];
DIS [MAX] mincost [MAX]을 int로;

보이드 Dijkstar () {
    (0 = 1을 나타내는 int 난 = N 단계;! I ++) {
        DIS [I] = MP [S] [I];
        mincost [I] = 가격 [S] [I];
        경로 [I]는 = s이 // 노드에 기록
    }
    [S] = 1;
    (0 = 1을 나타내는 int i가 N-1 '; I ++) {
        INT M = INF, m_c = INF;
        INT의 t;
        대 (INT의 J = 0;! J = N; J ++) {
            만약 (! 힘 [J] && m> DIS [J]) {
                m = [J]를 말한다;
                m_c = mincost [J]
                t = J;
            }
        }
        힘 [I] = 1;
        대 (INT의 J = 0;! J = N; J ++) {
            만약 (! 힘 [J]) {
                경우 (DIS [J]> MP [t] [J] + m) {
                    DIS [J] MP = [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] MP = [t] [J] + m;
                    mincost [J] = 가격 [t] [J] + m_c;
                    경로 [J]를 t =를;
                }
            }
        }
    }
    INT 인덱스 = D, 상위 = 0;
    INT 스택 [MAX];
    {(S! = 인덱스) 동안
        [상부 ++ = 인덱스 스택;
        인덱스 = 경로 [인덱스];
    }
    COUT << S << "";
    상단--;
    반면 (상부> = 0) {
        COUT << [top--] << ""스택;
    }
    COUT << DIS [D] << ''<< mincost [D] << ENDL;
}

() 주요 int로
{
    ; CIN >> N >> M은 S D >>
    memset 함수 (MP, 0x3F입니다,는 sizeof (MP));
    memset 함수 (비용, 0x3F입니다,는 sizeof (비용));
    memset 함수 (힘, 0는 sizeof (힘));
    A, B, S, C에서 INT;
    (0 = 1을 나타내는 int 난 = M;! I ++) {
        scanf와 ( "% D % D % D % D ', A, 및 B, S, C);
        경우 (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