Submission #1169350

#TimeUsernameProblemLanguageResultExecution timeMemory
1169350sunboiRobot (JOI21_ho_t4)C++20
0 / 100
319 ms40856 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
    int n, m; cin >> n >> m;
    vector<vector<vector<int>>> bad(n + 1);
    vector<vector<pair<int, int>>> g(n + 1);
    for (int i = 0; i < m; i++){
        int a;
        vector<int> info(3);
        
        //[0] = b
        //[1] = color
        //[2] = coste
        cin >> a;
        cin >> info[0] >> info[1] >> info[2];
        
        bad[a].push_back(info);
        swap(a, info[0]);
        bad[a].push_back(info);
    }
    
    for (int i = 1; i <= n; i++){
        map<int, int> val;
        
        for (vector<int> u : bad[i]){
            val[u[1]] += u[2];
        }
        
        int mn = 0;
        if (val.size() == m){
            for (int j = 1; j <= m; j++){
                mn = min(mn, val[j]);
            }
        }
        
        for (vector<int> u : bad[i]){
            int best = min(mn + u[2], val[u[1]] - u[2]);
            g[i].push_back({u[0], best});
        }
    }
    /*for (int i = 1; i <= n; i++){
        cout << "i::::::" << i << endl;
        for (auto u : g[i]){
            cout << u.first << ' ' << u.second << endl;
        }
        cout << endl;
    }*/
    
    vector<long long> dist(n + 1, 1e18);
 
	priority_queue<pair<int, int>> pq;
 
	dist[1] = 0;
	pq.push({0, 1});
 
	while (!pq.empty()) {
		const auto [cdist, node] = pq.top();
		pq.pop();
		
		if (dist[node] != -cdist) continue;

		for (auto x : g[node]){
		    if (x.second - cdist < dist[x.first]){
		        dist[x.first] = -(cdist - x.second);
		        pq.push({cdist - x.second, x.first});
		    }
		}
	}
	
	if (dist[n] != 1e18) cout << dist[n] << endl;
	else cout << -1 << endl;

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