제출 #1125462

#제출 시각아이디문제언어결과실행 시간메모리
1125462Kel_MahmutRobot (JOI21_ho_t4)C++20
34 / 100
3107 ms883600 KiB
#include <bits/stdc++.h>
#define pb push_back
#define endl ("\n")
#define all(aa) aa.begin(), aa.end()
typedef long long ll;
using namespace std;

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, m;
	cin >> n >> m;
	vector<array<int, 4>> edges(m);
	vector<vector<array<int, 3>>> g(n);
	for(int i = 0; i < m; i++){
		for(int j = 0; j < 4; j++) cin >> edges[i][j];
		edges[i][0]--;
		edges[i][1]--;
	}	
	
	vector<unordered_map<int, ll>> mpp(n);
	vector<unordered_map<int, pair<ll, ll>>> dir(n);
	for(int i = 0; i < m; i++){
		auto [a, b, c, p] = edges[i];
		g[a].pb({b, c, p});
		g[b].pb({a, c, p});
		mpp[a][c] += p;
		mpp[b][c] += p;
		dir[a][b] = make_pair(c, p);
		dir[b][a] = make_pair(c, p);
	}

	priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> pq;
	pq.push({0ll, 0ll, 1ll*n});
	vector<unordered_map<int, int>> vis(n + 1);
	ll ans = LLONG_MAX;
	while(!pq.empty()){
		auto [d, u, par] = pq.top(); pq.pop();

		if(vis[par][u]) continue;
		vis[u][par] = vis[par][u] = 1;
		if(u == n - 1){
			ans = min(ans, d);
		}

		for(auto [v, c, p] : g[u]){
			if(!vis[u][v]){
				ll cost = p;
				pq.push({d + cost, v, u});
			}
			if(!vis[v][n]){
				ll cost = mpp[u][c] - p;
				if(par != n){
					auto [parc, parp] = dir[par][u];
					if(parc == c) cost -= parp;
				}
				pq.push({d + cost, v, n});
			}
		}
	}

	cout << (ans == LLONG_MAX ? -1 : ans) << endl;
}





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