제출 #1130081

#제출 시각아이디문제언어결과실행 시간메모리
1130081am_aadvikOlympic Bus (JOI20_ho_t4)C++20
0 / 100
1096 ms26084 KiB
#include <iostream> #include<set> #include<map> #include<vector> #define int long long using namespace std; vector<vector<int>> g[205][2]; map<vector<int>, int> dist; vector<vector<int>> e; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; e.push_back({}); //1 based idxing for (int i = 1; i <= m; ++i) { int u, v, c, d; cin >> u >> v >> c >> d; g[u][0].push_back({ v, c ,d, i }); g[v][1].push_back({ u,c, d, i }); e.push_back({ u, v, c ,d }); } set<vector<int>> s; //{dist+cost, node, path, rev. edg.} s.insert({ 0, 1, 0, 0 }), dist[{1, 0, 0 }] = 0; while (s.size()) { vector<int> f = *s.begin(); s.erase(s.begin()); if (f[2] && (f[1] == 1)) { //complete! cout << f[0] << endl; return 0; } if (f[1] == n) f[2] = 1; //1 way complete! for (auto x : g[f[1]][1]) { //in edgs. f[3] = x[3]; if (dist.find({ x[0], f[2], f[3] }) != dist.end()) { if (dist[{ x[0], f[2], f[3] }] < (f[0] + x[1])) continue; //worse path s.erase({ dist[{ x[0], f[2], f[3] }], x[0], f[2], f[3] }); } dist[{ x[0], f[2], f[3] }] = (f[0] + x[1]); s.insert({ dist[{ x[0], f[2], f[3] }], x[0], f[2], f[3] }); f[3] = 0; } if (f[3] == 0) { for (auto x : g[f[1]][1]) { //in edgs. f[3] = x[3]; if (dist.find({ x[0], f[2], f[3] }) != dist.end()) { if (dist[{ x[0], f[2], f[3] }] < (f[0] + x[1] + x[2])) { f[3] = 0; continue; //worse path } s.erase({ dist[{ x[0], f[2], f[3] }], x[0], f[2], f[3] }); } dist[{ x[0], f[2], f[3] }] = (f[0] + x[1] + x[2]); s.insert({ dist[{ x[0], f[2], f[3] }], x[0], f[2], f[3] }); f[3] = 0; } } } cout << -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...