Submission #680701

#TimeUsernameProblemLanguageResultExecution timeMemory
680701vinnipuh01Olympic Bus (JOI20_ho_t4)C++17
100 / 100
167 ms4052 KiB
#include <iostream>
#include <bits/stdc++.h>
#include <cmath>
#include <algorithm>
#include <vector>
#include <deque>
#include <set>
#include <stack>
#include <string>
#include <map>
#include <queue>
#define sqrt sqrtl

using namespace std;

const long long oo = 1e18;

long long sum, ans = 0, mx = 0, mn = oo, num, pos;


/*
    ViHHiPuh

   (( `'-""``""-'` ))
     )-__-_.._-__-(
   / --- (o _ o) --- \
   \ .-* ( .0. ) *-. /
   _'-. ,_ '=' _, .-'_
  / `;#'#'# - #'#'#;` \
 \_)) -----'#'----- ((_/
      # --------- #
  '# ------- ------ #'
  /..-'# ------- #'-.\
  _\...-\'# -- #'/-.../_
  ((____)- '#' -(____))


    cout << fixed << setprecision(6) << x;


    freopen ( "sum.in", "r", stdin )
*/


int n, m, x[ 50001 ], y[ 50001 ], a[ 50001 ], b[ 50001 ];
long long dp[ 201 ][ 201 ], d[ 201 ];
int p[ 201 ], pp[ 201 ], used[ 201 ];
long long dpp[ 201 ][ 201 ];
vector <pair<int, int> > v[ 222 ], vv[ 222 ];
set <pair<int, int> > st;
int mp[ 50001 ];

void dfs( int u ) {
	for ( int i = 1; i <= n; i ++ ) {
		d[ i ] = oo;
		p[ i ] = -1;
		used[ i ] = pp[ i ] = 0;
	}
	d[ u ] = 0;
	while ( true ) {
		num = -1;
		for ( int i = 1; i <= n; i ++ ) {
			if ( used[ i ] )
				continue;
			if ( num == -1 || d[ i ] < d[ num ] )
				num = i;
		}
		if ( num == -1 || d[ num ] == oo )
			break;
		used[ num ] = 1;
		for ( auto to : v[ num ] ) {
			if ( d[ to.first ] > d[ num ] + a[ to.second ] ) {
				d[ to.first ] = d[ num ] + a[ to.second ];
				p[ to.first ] = num;
				pp[ to.first ] = to.second;
			}
		}
	} 
}

void dfss( int u ) {
	for ( int i = 1; i <= n; i ++ ) {
		d[ i ] = oo;
		p[ i ] = -1;
		used[ i ] = pp[ i ] = 0;
	}
	d[ u ] = 0;
	while ( true ) {
		num = -1;
		for ( int i = 1; i <= n; i ++ ) {
			if ( used[ i ] )
				continue;
			if ( num == -1 || d[ i ] < d[ num ] )
				num = i;
		}
		if ( num == -1 || d[ num ] == oo )
			break;
		used[ num ] = 1;
		for ( auto to : vv[ num ] ) {
			if ( d[ to.first ] > d[ num ] + a[ to.second ] ) {
				d[ to.first ] = d[ num ] + a[ to.second ];
				p[ to.first ] = num;
				pp[ to.first ] = to.second;
			}
		}
	}
}

main () {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for ( int i = 1; i <= m; i ++ ) {
		cin >> x[ i ] >> y[ i ] >> a[ i ] >> b[ i ];
		v[ x[ i ] ].push_back( { y[ i ], i } );	
		vv[ y[ i ] ].push_back( { x[ i ], i } );
	}
	dfss( 1 );
	for ( int i = 1; i <= n; i ++ )
		dpp[ i ][ 1 ] = d[ i ];
	dfss( n );
	for ( int i = 1; i <= n; i ++ )
		dpp[ i ][ n ] = d[ i ];
	dfs( 1 );
	for ( int i = 1; i <= n; i ++ )
		dp[ 1 ][ i ] = d[ i ];
	for ( int i = n; i != -1; i = p[ i ] )
		mp[ pp[ i ] ] = 1;
	dfs( n );
	for ( int i = 1; i <= n; i ++ )
		dp[ n ][ i ] = d[ i ];
	for ( int i = 1; i != -1; i = p[ i ] )
		mp[ pp[ i ] ] = 1;
	ans = oo;
	if ( dp[ 1 ][ n ] != oo && dp[ n ][ 1 ] != oo )
		ans = dp[ 1 ][ n ] + dp[ n ][ 1 ];
	for ( int i = 1; i <= m; i ++ ) {
		if ( mp[ i ] ) {
			for ( int j = 0; j < v[ x[ i ] ].size(); j ++ ) {
				if ( v[ x[ i ] ][ j ].second == i ) {
					v[ x[ i ] ].erase( v[ x[ i ] ].begin() + j );
					break;
				}
			}
			v[ y[ i ] ].push_back( { x[ i ], i } );
			dfs( 1 );
			sum = d[ n ];
			dfs( n );
			if ( sum != oo && d[ 1 ] != oo )
				ans = min( ans, d[ 1 ] + sum + b[ i ] );
			v[ y[ i ] ].pop_back();
			v[ x[ i ] ].push_back( { y[ i ], i } );
		}
		else {
			num = dp[ 1 ][ n ];
			sum = dp[ n ][ 1 ];
			num = min( num, dp[ 1 ][ y[ i ] ] + a[ i ] + dpp[ x[ i ] ][ n ] + 0ll );
			sum = min( sum, dp[ n ][ y[ i ] ] + a[ i ] + dpp[ x[ i ] ][ 1 ] + 0ll );
//			cout << num << " " << sum << " " << b[ i ] << "\n";
			if ( num != oo && sum != oo )
				ans = min( sum + num + b[ i ], ans );
		}
//		cout << i << " - " << ans << "\n";
	}
	if ( ans == oo )
		cout << "-1";
	else
		cout << ans;
}

/*

dp[ 1 ][ y ] + a[ i ] + b[ i ] + dp[ x ][ n ]
dp[ n ][ x ] + a[ i ] + b[ i ] + dp[ x ][ 1 ]


*/

Compilation message (stderr)

ho_t4.cpp:109:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  109 | main () {
      | ^~~~
ho_t4.cpp: In function 'int main()':
ho_t4.cpp:139:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |    for ( int j = 0; j < v[ x[ i ] ].size(); j ++ ) {
      |                     ~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...