제출 #1176640

#제출 시각아이디문제언어결과실행 시간메모리
1176640lechaaCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
235 ms30300 KiB
#include <bits/stdc++.h> using namespace std; #define int long long vector<vector<int>> p; vector<bool> j; int ans = 1e18; vector<int> dis; vector<int> dis1; vector<pair<int, int>> dp; vector<int> topo; void dfs(int k){ j[k] = true; for(int i = 0; i < p[k].size(); i++){ topo[p[k][i]]++; if(j[p[k][i]]) continue; dfs(p[k][i]); } } main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; int s, t; cin >> s >> t; int u, v; cin >> u >> v; topo.resize(n+1); j.resize(n+1); vector<vector<pair<int, int>>> g(n+1); for(int i = 0; i < m; i++){ int a, b; cin >> a >> b; int c; cin >> c; g[a].push_back({b, c}); g[b].push_back({a, c}); } p.resize(n+1); vector<bool> d(n+1); vector<int> mn(n+1, 1e18); multiset<pair<int, int>> q; q.insert({0, s}); while(!q.empty()){ auto [time, k] = *q.begin(); q.erase(q.begin()); if(d[k] || k == t) continue; d[k] = true; for(auto [v, ti] : g[k]){ if(mn[v] == ti + time){ p[v].push_back(k); } if(d[v]) continue; if(mn[v] > ti + time){ mn[v] = ti+time; p[v] = {k}; q.insert({mn[v], v}); } } } q.clear(); q.insert({0, u}); dp.resize(n+1, {1e18, 1e18}); dis.resize(n+1, 1e18); dis[u] = 0; d.clear(); d.resize(n+1, false); while(q.size() > 0){ auto [time, k] = *q.begin(); q.erase(q.begin()); if(d[k]) continue; d[k] = true; for(auto [v, ti] : g[k]){ if(d[v]) continue; if(dis[v] > ti + time){ dis[v] = ti+time; q.insert({dis[v], v}); } } } q.clear(); q.insert({0, v}); dis1.resize(n+1, 1e18); dis1[v] = 0; d.clear(); d.resize(n+1, false); while(q.size() > 0){ auto [time, k] = *q.begin(); q.erase(q.begin()); if(d[k]) continue; d[k] = true; for(auto [v, ti] : g[k]){ if(d[v]) continue; if(dis1[v] > ti + time){ dis1[v] = ti+time; q.insert({dis1[v], v}); } } } queue<int> r; r.push(t); dfs(t); j.clear(); j.resize(n+1, false); while(!r.empty()){ int k = r.front(); r.pop(); if(j[k]) continue; j[k] = true; dp[k].first = min(dp[k].first, dis[k]); dp[k].second = min(dp[k].second, dis1[k]); for(int i = 0; i < p[k].size(); i++){ if(j[p[k][i]]){ continue; } topo[p[k][i]]--; dp[p[k][i]].first = min(min(dp[k].first, dis[k]), dp[p[k][i]].first); dp[p[k][i]].second = min(dp[p[k][i]].second, min(dp[k].second, dis1[k])); if(topo[p[k][i]] == 0){ r.push(p[k][i]); } } ans = min(ans, min(dp[k].first + dis1[k], dp[k].second + dis[k])); } cout << min(ans, dis[v]) << "\n"; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp:21:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   21 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...