結果
問題 | No.17 2つの地点に泊まりたい |
ユーザー |
![]() |
提出日時 | 2020-12-04 21:19:19 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 5 ms / 5,000 ms |
コード長 | 1,684 bytes |
コンパイル時間 | 1,827 ms |
コンパイル使用メモリ | 200,748 KB |
最終ジャッジ日時 | 2025-01-16 16:05:52 |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 27 |
ソースコード
#include <bits/stdc++.h>#define rep(i,n) for(int i = 0; i < (n); ++i)#define drep(i,n) for(int i = (n)-1; i >= 0; --i)#define srep(i,s,t) for (int i = s; i < t; ++i)using namespace std;typedef long long int ll;typedef pair<ll,ll> P;#define yn {puts("Yes");}else{puts("No");}struct edge{ ll to, cost; };const ll INF = 1001001001001001001;const int MAX_N = 205;const int MAX_V = 20005;vector<edge> G[MAX_V];ll d[MAX_V];void dijkstra(int s){// greater<P>を指定することでfirstが小さい順に取り出せるようにするpriority_queue<P, vector<P>, greater<P> > que;fill(d, d+MAX_V, INF);d[s] = 0;que.push(P(0, s));while(!que.empty()){P p = que.top();que.pop();int v = p.second;for(int i=0; i<G[v].size(); i++){edge e = G[v][i];if(d[e.to] > d[v] + e.cost){d[e.to] = d[v] + e.cost;que.push(P(d[e.to], e.to));}}}}int main() {int n; cin >> n;int a[n] = {};rep(i,n) cin >> a[i];int m; cin >> m;rep(i,m){int from, to, cost;cin >> from >> to >> cost;edge e;e.to = to;e.cost = cost;G[from].push_back(e);e.to = from;e.cost = cost;G[to].push_back(e);}ll dd[n][n];rep(i,n){dijkstra(i);rep(j,n) dd[i][j] = d[j];}ll ans = INF;srep(i,1,n-1){srep(j,1,n-1){if(i == j) continue;ll tmp = dd[0][i] + dd[i][j] + dd[j][n-1] + a[i] + a[j];ans = min(ans, tmp);}}cout << ans << endl;return 0;}