제출 #534306

#제출 시각아이디문제언어결과실행 시간메모리
534306Haruto810198Olympic Bus (JOI20_ho_t4)C++17
0 / 100
28 ms1868 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double

#define FOR(i, l, r, d) for(int i=(l); i<=(r); i+=(d))
#define szof(x) ((int)(x).size())

#define vi vector<int>
#define pii pair<int, int>

#define F first
#define S second

#define pb push_back
#define eb emplace_back
#define mkp make_pair

const int INF = INT_MAX;
const int LNF = 1e18;
const int MOD = 1000000007;
const double eps = 1e-12;

// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")

const int MAX = 210;

int n, m;
int dis[MAX][MAX];
int dis2[MAX][MAX];
int res;

void FloydWarshall(){
	FOR(k, 1, n, 1){
		FOR(i, 1, n, 1){
			FOR(j, 1, n, 1){
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
			}
		}
	}
}

// 1 -> n, n -> 1
vector<pii> eout, ein;

signed main(){
	
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m;
	FOR(i, 1, n, 1){
		FOR(j, 1, n, 1){
			dis[i][j] = dis2[i][j] = LNF;
		}
	}

	FOR(i, 1, m, 1){
		int u, v, c, d;
		cin>>u>>v>>c>>d;
		dis[u][v] = min(dis[u][v], c);
		dis2[v][u] = min(dis2[v][u], c+d);
		
		if(u == 1 and v == n) eout.eb(c, c+d);
		if(u == n and v == 1) ein.eb(c, c+d);
	}
	
	FloydWarshall();
	
	// not inverting an edge
	int res = dis[1][n] + dis[n][1];
	cerr<<"not inverting : "<<res<<endl;

	// len. of cycle >= 3 :
	// 1 ~> u -> n -> 1
	// 1 -> u ~> n -> 1
	// 1 -> u -> n ~> 1
	int owo = LNF;
	FOR(u, 2, n-1, 1){
		res = min({res,
		dis2[1][u] + dis[u][n] + dis[n][1], 
		dis[1][u] + dis2[u][n] + dis[n][1],
		dis[1][u] + dis[u][n] + dis2[n][1],

		dis2[u][1] + dis[n][u] + dis[1][n], 
		dis[u][1] + dis2[n][u] + dis[1][n],
		dis[u][1] + dis[n][u] + dis2[1][n]
		});

		owo = min({owo,
		dis2[1][u] + dis[u][n] + dis[n][1], 
		dis[1][u] + dis2[u][n] + dis[n][1],
		dis[1][u] + dis[u][n] + dis2[n][1],

		dis2[u][1] + dis[n][u] + dis[1][n], 
		dis[u][1] + dis2[n][u] + dis[1][n],
		dis[u][1] + dis[n][u] + dis2[1][n]
		});
	}
	cerr<<"len = 3 : "<<owo<<endl;

	// len. of cycle == 2 : special case
	// 1 -> n -> 1
	res = min(res, dis[1][n] + dis[n][1]);
	owo = dis[1][n] + dis[n][1];

	// 1 -> n ~> 1
	multiset<int> st;
	for(pii e : eout) st.insert(e.F);
	for(pii e : eout){
		st.erase(st.find(e.F));
		if(!st.empty()){
			res = min(res, e.S + *st.begin());
			owo = min(owo, e.S + *st.begin());
		}
		st.insert(e.F);
	}

	// 1 ~> n -> 1
	st.clear();
	for(pii e : ein) st.insert(e.F);
	for(pii e : ein){
		st.erase(st.find(e.F));
		if(!st.empty()){
			res = min(res, e.S + *st.begin());
			owo = min(owo, e.S + *st.begin());
		}
		st.insert(e.F);
	}

	cerr<<"len = 2 : "<<owo<<endl;
	
	if(res < LNF) cout<<res<<'\n';
	else cout<<-1<<'\n';

	return 0;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...