제출 #1273111

#제출 시각아이디문제언어결과실행 시간메모리
1273111trantrungkeinRobot (JOI21_ho_t4)C++20
34 / 100
3097 ms55216 KiB
#include<bits/stdc++.h> using namespace std; const int N = 2e5 + 7; vector<tuple<int,int,long long>> g[N]; map<int,long long> dp2[N],sum[N]; long long dp[N],n,m; struct Node { int u,c; long long dist; bool operator < (const Node &other) const { return dist > other.dist; } }; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin >> n >> m; for(int i = 1; i <= m; i++) { int u,v,c; long long p; cin >> u >> v >> c >> p; g[u].push_back({v,c,p}); g[v].push_back({u,c,p}); sum[u][c] += p; sum[v][c] += p; } fill(dp+1,dp+n+1,1e18); dp[1] = 0; priority_queue<Node> q; q.push({1,0,0}); while(!q.empty()) { auto [u,c,dist] = q.top(); q.pop(); if(c != 0) { if(dp2[u][c] != dist) continue; for(auto [v,color,p] : g[u]) if(color == c) { long long value = dist + sum[u][color] - p; if(dp[v] > value) { dp[v] = value; q.push({v,0,dp[v]}); } } } else { if(dp[u] != dist) continue; for(auto [v,color,p] : g[u]) { long long value = dist + sum[u][color] - p; if(dp[v] > value) { dp[v] = value; q.push({v,0,dp[v]}); } value = dist + p; if(dp[v] > value) { dp[v] = value; q.push({v,0,dp[v]}); } if(!dp2[v].count(color) || dp2[v][color] > dist) { dp2[v][color] = dist; q.push({v,color,dp2[v][color]}); } } } } if(dp[n] == 1e18) cout << -1; else cout << dp[n]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...