結果
問題 | No.2569 はじめてのおつかいHard |
ユーザー |
![]() |
提出日時 | 2023-12-15 15:05:00 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 354 ms / 2,000 ms |
コード長 | 2,119 bytes |
コンパイル時間 | 1,287 ms |
コンパイル使用メモリ | 114,756 KB |
実行使用メモリ | 26,384 KB |
最終ジャッジ日時 | 2024-09-27 06:25:53 |
合計ジャッジ時間 | 3,685 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 10 |
ソースコード
#include<iostream>#include<vector>#include<algorithm>using namespace std;using ll = long long;#include<queue>template< typename T >struct edge{int from,to;T cost;edge(int from,int to, T cost):from(from),to(to),cost(cost){};edge &operator=(const int& x){to = x;return *this;}};template< typename T >struct graph{int n;vector<vector<edge<T>>> e;graph(int n):n(n),e(n){}void addedge(int from,int to,T cost){e[from].emplace_back(from,to,cost);}vector<edge<T>> &operator[](int i) {return e[i];}};/** O(ElogV)* 到達不能の場合は―1が入ってる。*/template< typename T >vector<T> dijkstra(graph<T>& g, int st){int n = g.n;using pt = pair<T,int>;vector<T> dist(n,-1);dist[st] = 0;priority_queue<pt, vector<pt>, greater<pt>>que;que.emplace(0,st);while(que.size()){int ni;T cost;cost = que.top().first;ni = que.top().second;que.pop();if(dist[ni]<cost&&dist[ni]!=-1) continue;for(edge<T> itr:g[ni]){int nxt = itr.to;if(dist[nxt]>cost+itr.cost||dist[nxt]==-1){dist[nxt] = cost + itr.cost;que.emplace(dist[nxt],nxt);}}}return dist;};int main(){cin.tie(nullptr);ios::sync_with_stdio(false);int n,m;cin>>n>>m;graph<ll> g(n),gg(n);for(int i = 0;i<m;i++){ll u,v,t;cin>>u>>v>>t;u--;v--;g.addedge(u,v,t);gg.addedge(v,u,t);}auto d1 = dijkstra(g,n-2);auto d2 = dijkstra(g,n-1);auto d3 = dijkstra(gg,n-2);auto d4 = dijkstra(gg,n-1);for(int i = 0;i<n;i++){if(d1[i]==-1) d1[i] = 1e18;if(d2[i]==-1) d2[i] = 1e18;if(d3[i]==-1) d3[i] = 1e18;if(d4[i]==-1) d4[i] = 1e18;}for(int i = 0;i<n-2;i++){ll ans = 1e18;ans = min(ans,d3[i]+d1[n-1]+d2[i]);ans = min(ans,d4[i]+d2[n-2]+d1[i]);if(ans==1e18) ans = -1;cout<<ans<<endl;}}