Submission #41586

#TimeUsernameProblemLanguageResultExecution timeMemory
41586chonkaCommuter Pass (JOI18_commuter_pass)C++98
100 / 100
589 ms20004 KiB
#include<iostream> #include<stdio.h> #include<vector> #include<queue> using namespace std ; #define MAXN 200007 long long inf ; int n , m ; int p1 , p2 ; int p3 , p4 ; vector < pair < int , int > > v[ MAXN ] ; long long f[ MAXN ][ 5 ] ; long long dp[ MAXN ][ 3 ] ; struct tuhla { int vertex ; long long cost ; tuhla ( ) { vertex = cost = 0 ; } tuhla ( int _vertex , long long _cost ) { vertex = _vertex ; cost = _cost ; } }; bool operator < ( tuhla aux1 , tuhla aux2 ) { return ( aux1.cost > aux2.cost ) ; } priority_queue < tuhla > q ; void dijkstra ( int vertex , int id ) { int i ; for ( i = 1 ; i <= n ; i ++ ) { f[ i ][ id ] = inf ; } f[ vertex ][ id ] = 0 ; q.push ( tuhla ( vertex , 0 ) ) ; while ( q.empty ( ) == false ) { tuhla u = q.top ( ) ; q.pop ( ) ; if ( u.cost != f[ u.vertex ][ id ] ) { continue ; } int sz = v[ u.vertex ].size ( ) ; for ( i = 0 ; i < sz ; i ++ ) { int h = v[ u.vertex ][ i ].first ; int c = v[ u.vertex ][ i ].second ; if ( f[ h ][ id ] > u.cost + c ) { f[ h ][ id ] = u.cost + c ; q.push ( tuhla ( h , f[ h ][ id ] ) ) ; } } } } void calc_dp ( int vertex , int id , int pos ) { int i ; for ( i = 1 ; i <= n ; i ++ ) { f[ i ][ id ] = inf ; dp[ i ][ pos ] = inf ; } f[ vertex ][ id ] = 0 ; dp[ vertex ][ pos ] = f[ vertex ][ 2 ] ; q.push ( tuhla ( vertex , 0 ) ) ; while ( q.empty ( ) == false ) { tuhla u = q.top ( ) ; q.pop ( ) ; if ( u.cost != f[ u.vertex ][ id ] ) { continue ; } int sz = v[ u.vertex ].size ( ) ; for ( i = 0 ; i < sz ; i ++ ) { int h = v[ u.vertex ][ i ].first ; int c = v[ u.vertex ][ i ].second ; if ( f[ h ][ id ] > u.cost + c ) { f[ h ][ id ] = u.cost + c ; q.push ( tuhla ( h , f[ h ][ id ] ) ) ; dp[ h ][ pos ] = inf ; } if ( f[ h ][ id ] == u.cost + c ) { dp[ h ][ pos ] = min ( dp[ h ][ pos ] , min ( f[ h ][ 2 ] , dp[ u.vertex ][ pos ] ) ) ; } } } } void input ( ) { scanf ( "%d%d" , &n , &m ) ; scanf ( "%d%d" , &p1 , &p2 ) ; scanf ( "%d%d" , &p3 , &p4 ) ; int i ; for ( i = 1 ; i <= m ; i ++ ) { int x , y , z ; scanf ( "%d%d%d" , &x , &y , &z ) ; v[ x ].push_back ( make_pair ( y , z ) ) ; v[ y ].push_back ( make_pair ( x , z ) ) ; } inf = 1 ; for ( i = 1 ; i <= 16 ; i ++ ) { inf *= 10 ; } } void solve ( ) { dijkstra ( p3 , 1 ) ; dijkstra ( p4 , 2 ) ; calc_dp ( p1 , 3 , 1 ) ; calc_dp ( p2 , 4 , 2 ) ; int i ; long long ans = f[ p4 ][ 1 ] ; for ( i = 1 ; i <= n ; i ++ ) { if ( f[ i ][ 3 ] + f[ i ][ 4 ] == f[ p2 ][ 3 ] ) { long long cur = f[ i ][ 1 ] + min ( dp[ i ][ 1 ] , dp[ i ][ 2 ] ) ; if ( ans > cur ) { ans = cur ; } } } printf ( "%lld\n" , ans ) ; } int main ( ) { input ( ) ; solve ( ) ; return 0 ; }

Compilation message (stderr)

commuter_pass.cpp: In function 'void input()':
commuter_pass.cpp:87:32: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf ( "%d%d" , &n , &m ) ;
                                ^
commuter_pass.cpp:88:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf ( "%d%d" , &p1 , &p2 ) ;
                                  ^
commuter_pass.cpp:89:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf ( "%d%d" , &p3 , &p4 ) ;
                                  ^
commuter_pass.cpp:93:43: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf ( "%d%d%d" , &x , &y , &z ) ;
                                           ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...