Submission #1240116

#TimeUsernameProblemLanguageResultExecution timeMemory
1240116GeforgsRobot (JOI21_ho_t4)C++20
100 / 100
537 ms96564 KiB
#include <iostream> #include <iomanip> #include <vector> #include <cmath> #include <algorithm> #include <set> #include <queue> #include <map> #include <unordered_map> #include <stack> #include <bitset> #include <string> #include <cstring> #include <iterator> #include <random> #define ll long long #define ld long double #define inf (ll)(2*1e18) #define sort(a) sort(a.begin(), a.end()) #define reverse(a) reverse(a.begin(), a.end()) #define pb push_back #define endl "\n" using namespace std; void Dijkstra(ll start, vector<vector<pair<ll, ll>>>& a, vector<ll>& dis){ set<pair<ll, ll>> s; s.insert({0, start}); dis[start] = 0; while(!s.empty()){ auto [val, x] = *s.begin(); s.erase(s.begin()); for(auto [y, w]: a[x]){ if(dis[y] > val + w){ s.erase({dis[y], y}); dis[y] = val + w; s.insert({dis[y], y}); } } } } void solve(){ ll n, m, i, j, x, y, w, c; cin>>n>>m; vector<vector<pair<ll, ll>>> a(n); vector<vector<pair<ll, ll>>> b(n); vector<vector<ll>> color(n); vector<ll> sums(m); map<pair<ll, ll>, ll> change; for(i=0;i<m;++i){ cin>>x>>y>>c>>w; --x; --y; a[x].pb({y, w}); a[y].pb({x, w}); color[x].pb(c); color[y].pb(c); } for(i=0;i<n;++i){ for(j=0;j<a[i].size();++j){ sums[color[i][j]] += a[i][j].second; } for(j=0;j<a[i].size();++j){ if(change.find({i, color[i][j]}) == change.end()){ change[{i, color[i][j]}] = a.size(); a.pb(vector<pair<ll, ll>>()); b.pb(vector<pair<ll, ll>>()); } b[change[{i, color[i][j]}]].pb({a[i][j].first, sums[color[i][j]] - a[i][j].second}); b[a[i][j].first].pb({change[{i, color[i][j]}], 0}); a[i][j].second = min(a[i][j].second, sums[color[i][j]] - a[i][j].second); } for(j=0;j<a[i].size();++j){ sums[color[i][j]] = 0; } } for(i=0;i<b.size();++i){ for(auto el: b[i]){ a[i].pb(el); } } vector<ll> dis(a.size(), inf); Dijkstra(0, a, dis); if(dis[n-1] == inf){ cout<<-1<<endl; }else{ cout<<dis[n-1]<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); srand(time(nullptr)); ll t=1; // cin>>t; for(;t>0;--t){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...