@@ -17,38 +17,42 @@ fn main() {
1717 adj[ u] . push ( ( v, w) ) ;
1818 }
1919
20- fn dfs (
21- adj : & [ Vec < ( usize , u64 ) > ] ,
22- dist : & [ u64 ] ,
23- u : usize ,
24- path : & mut Vec < usize > ,
25- seen : & mut [ bool ] ,
26- t : usize ,
27- ) {
28- if seen[ u] {
29- return ;
30- }
31- seen[ u] = true ;
32- path. push ( u) ;
33- if u == t {
34- println ! ( "{} {}" , dist[ u] , path. len( ) - 1 ) ;
35- for i in 0 ..path. len ( ) - 1 {
36- println ! ( "{} {}" , path[ i] , path[ i + 1 ] ) ;
37- }
38- std:: process:: exit ( 0 ) ;
39- }
20+ let dist = dijk ( & adj, s) ;
21+
22+ if dist[ t] == u64:: MAX {
23+ println ! ( "{}" , -1 ) ;
24+ return ;
25+ }
26+
27+ let mut par = vec ! [ 0 ; n] ;
28+ par[ s] = s;
29+ let mut seen = vec ! [ false ; n] ;
30+ seen[ s] = true ;
31+ let mut q = std:: collections:: VecDeque :: new ( ) ;
32+ q. push_back ( s) ;
33+ while let Some ( u) = q. pop_front ( ) {
4034 for & ( v, w) in & adj[ u] {
41- if dist[ u] + w = = dist[ v] {
42- dfs ( adj , dist , v , path , seen , t ) ;
35+ if seen [ v ] || dist[ u] + w ! = dist[ v] {
36+ continue ;
4337 }
38+ par[ v] = u;
39+ seen[ v] = true ;
40+ q. push_back ( v) ;
4441 }
45- path. pop ( ) ;
4642 }
4743
48- let dist = dijk ( & adj, s) ;
4944 let mut path = vec ! [ ] ;
50- let mut seen = vec ! [ false ; n] ;
51- dfs ( & adj, & dist, s, & mut path, & mut seen, t) ;
45+ let mut u = t;
46+ while u != s {
47+ path. push ( u) ;
48+ u = par[ u] ;
49+ }
50+ path. push ( s) ;
5251
53- println ! ( "{}" , -1 ) ;
52+ path. reverse ( ) ;
53+
54+ println ! ( "{} {}" , dist[ t] , path. len( ) - 1 ) ;
55+ for it in 0 ..path. len ( ) - 1 {
56+ println ! ( "{} {}" , path[ it] , path[ it + 1 ] ) ;
57+ }
5458}
0 commit comments