노드 번호를 매핑하여 // 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을 반환;
}