제출 #1268100

#제출 시각아이디문제언어결과실행 시간메모리
1268100sean503Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
328 ms27188 KiB
#include<iostream> #include<vector> #include<cstdlib> #include<string> #include<algorithm> #include<set> #include<math.h> #include<map> #include<deque> #include<unordered_map> #include<iomanip> #include<queue> #include<array> #include<climits> #include<cstring> #include<unordered_set> #include<cstdint> #include<typeinfo> #include <random> using namespace std; #define int long long const int MAX = 999999999999999LL; vector<vector<pair<int,int>>> adj; vector<int> len1; vector<int> len2; vector<int> val; int n,m; void func(int fx, int ch){ priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; pq.push({0,fx}); while(!pq.empty()){ int y = pq.top().first; int x = pq.top().second; pq.pop(); if(ch == 1 && len1[x] <= y || ch == 2 && len2[x] <= y){ continue; } if(ch == 1){ len1[x] = y; }else{ len2[x] = y; } for(int i = 0; i<adj[x].size(); i++){ pq.push({adj[x][i].second + y,adj[x][i].first}); } } } int func2(int cx, int cy){ priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>> pq; vector<pair<int,int>> v(n+1,{MAX,MAX}); vector<bool> vis(n+1,false); pq.push({0,{cx,0}}); while(!pq.empty()){ int node = pq.top().second.first; int prev = pq.top().second.second; int cost = pq.top().first; pq.pop(); if(val[node] < cost){ continue; } if(val[node] == cost && vis[node]){ if(min(v[prev].first,len1[node]) + min(v[prev].second,len2[node]) > v[node].first + v[node].second){ continue; } v[node].first = min(v[prev].first,len1[node]); v[node].second = min(v[prev].second,len2[node]); continue; } vis[node] = true; v[node].first = min(len1[node],v[prev].first); v[node].second = min(len2[node],v[prev].second); val[node] = cost; for(int i = 0; i<adj[node].size(); i++){ pq.push({cost+adj[node][i].second,{adj[node][i].first,node}}); } } return v[cy].first+v[cy].second; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>m; adj.resize(n+1); len1.assign(n+1,MAX); len2.assign(n+1,MAX); val.assign(n+1,MAX); int cx,cy,lx,ly; cin>>cx>>cy>>lx>>ly; for(int i = 0; i<m; i++){ int x,y,z; cin>>x>>y>>z; adj[x].push_back({y,z}); adj[y].push_back({x,z}); } func(lx,1); func(ly,2); int ans = len1[ly]; ans = min(func2(cx,cy),ans); ans = min(func2(cy,cx),ans); cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...