2019 가축 오프 더 학교 네 번째 J-무료 (익스트라 + DP)

링크 : https://ac.nowcoder.com/acm/contest/884/J

귀하는 graph.Every 에지 연결된 undirect 주어진 T에 S에서 경로를 선택해야 pass.You에 비용이 당신은 당신의 경로에있는 모든 가장자리를 지불 할 필요가있다. 그러나 그래프에서 가장 K 가장자리에서 선택하고 시작 0으로 비용을 변경할 수 있습니다. 당신이 지불하는 데 필요한 최소한의 총 비용에 답변 해주세요.

설명을 입력합니다 :

첫 번째 라인은 다섯 개 정수 N, M, S, T, K를 포함한다. 

다음의 m 행의 각각에 대해, 세 개의 정수 A, B, L은 A와 B 사이의 L 비용 에지가 의미가있다.

N은 노드와 m의 수가 에지의 수이다.

출력 설명 :

최소 총 비용을 의미하는 정수입니다.
예 1

기입

복사
3 2 1 3 1 
1 2 1 
2 3 2

수출

복사
1

비고 :

1≤n, m≤103,1≤S, T, A, b≤n, 0≤k≤m, 1≤l≤106 1 N , m의 1 0 3 , 1 S , T , , B N , 0 k 값 ≤의 m , 1 L 1 0 6. 다중 가장자리와 자기 루프가 허용된다.


1 #INCLUDE <iostream>
 2 #INCLUDE <큐>
 3 #INCLUDE <CString을>
 4  이용한  스페이스 성병;
5  
6  CONST의  INT N = INT (1e3) + (10) ;
7  CONST  INT INF = 0x3f3f3f3f ;
8  
9  구조체 에지 {
 10      INT 에 w 다음;
11 } E [N + N];
12  
(13)  INT의 CNT 머리 [N], K;
14  
15  공극 추가 ( int로 A, INT의 B,INT w) {
 16      INT의 ID = ++ CNT;
17      = .TO의 E [ID] B;
18      E [ID] .W = w;
19      E [ID] 다음 내용 = 헤드 [A];
20      헤드 [A] = ID;
21  }
 22  
23  구조체 노드 {
 24      의 INT NUM, DIS, K;
25      부울  연산자 <( CONST 노드 X) CONST {
 26           DIS> x.dis;
27      }
 28  };
29  
30  INT힘 [N] [N], DIS [N] [N];
31  
32  공극 익스트라 ( INT의 S) {
 33      priority_queue <노드> Q;
34      memset 함수 (힘, 0 , 는 sizeof (힘));
35      memset 함수 (DIS, INF, 는 sizeof (DIS));
36      DIS [들] [ 0 ] = 0 ;
37      q.push (노드 {S, DIS [S] [ 0 , 0 });
38      동안 (! q.empty ()) {
 39          노드 X = q.top ();
40          q.pop ();
41          INT N =x.num;
42          INT의 K = XK;
43          의 경우 (힘 [N] [K]) 계속 ;
44          힘 [N]을 [K] = 1 ;
(45)          에 대한이 ( int로 -;! I = I = 헤드 [N] 1 , I = {E [i]는 다음 내용)
 46              INT의 V = E [I] .TO, W = 전자 [I] .W;
(47)              의 경우 (K <K && DIS [N] [K] <DIS [V] [K + 1 ]) {
 48                  DIS [V] [K + 1 ] = DIS [N] [K];
49                  q.push (노드 {V, DIS [V] [K + 1 , K + 1 });
(50)             }
 (51)              의 경우 (w + DIS [N] [K] < DIS [V] [K]) {
 52                  DIS [V] [K] = DIS [N] [K] + w;
53                  q.push (노드 {V, DIS [V] [K], K});
54              }
 55          }
 56      }
 57  }
 58  
59  INT 의 main () {
 60      IOS :: sync_with_stdio ( 0 );
61      memset 함수 (헤드 - 1 , 를 sizeof (헤드));
62      INT의 N, M, S, T;
63      CIN >> >> m N >> S T >> >> K;
64      동안 (M--) {
 65          INT의 A, B, L;
66          CIN 사항 >> >> B >> L;
(67)          추가 (A, B, l);
(68)          추가 (B, A, l);
69      }
 70      익스트라 (S);
71      INT ANS = INF;
(72)      에 대한이 ( int로 I = 0 ; I는 <= K를, 난 ++) ANS = 분 (ANS, DIS [T] [I]);
73      COUT << ANS << ENDL;
74 }

 

 

추천

출처www.cnblogs.com/Waldeinsamkeit/p/11260775.html