結果
| 問題 |
No.788 トラックの移動
|
| コンテスト | |
| ユーザー |
Manuel1024
|
| 提出日時 | 2021-03-25 03:17:16 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 408 ms / 2,000 ms |
| コード長 | 1,929 bytes |
| コンパイル時間 | 1,212 ms |
| コンパイル使用メモリ | 87,044 KB |
| 実行使用メモリ | 34,688 KB |
| 最終ジャッジ日時 | 2024-12-15 07:09:25 |
| 合計ジャッジ時間 | 3,945 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
using ll = long long int;
using P = pair<ll, int>;
constexpr ll INF = 1001001001001001001;
ll solve(int n, int m, int l, vector<int> &t, vector<vector<ll>> &dist, int goal){
ll ans = dist[l][goal];
for(int i = 0; i < n; i++){
ans += (ll)t[i] * dist[goal][i] * 2;
}
ll diff = 0;
for(int i = 0; i < n; i++){
if(t[i] == 0) continue;
diff = max(diff, dist[l][goal] + dist[goal][i] - dist[l][i]);
}
//cerr << ans << " " << diff << endl;
return ans-diff;
}
int main(){
int n, m, l;
cin >> n >> m >> l;
l--;
vector<int> t(n);
for(auto &p: t) cin >> p;
vector<vector<P>> G(n);
for(int i = 0; i < m; i++){
int a, b, c;
cin >> a >> b >> c;
a--; b--;
G[a].push_back(make_pair(c, b));
G[b].push_back(make_pair(c, a));
}
vector<vector<ll>> dist(n, vector<ll>(n, INF));
for(int i = 0; i < n; i++){
priority_queue<P, vector<P>, greater<P>> Q;
Q.push(make_pair(0, i));
dist[i][i] = 0;
while(Q.size()){
P cur = Q.top();
Q.pop();
if(dist[i][cur.second] < cur.first) continue;
for(auto &p: G[cur.second]){
if(dist[i][p.second] <= cur.first+p.first) continue;
dist[i][p.second] = cur.first+p.first;
Q.push(make_pair(dist[i][p.second], p.second));
}
}
}
/*
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++) cerr << dist[i][j] << " ";
cerr << endl;
}
*/
ll ans = INF;
for(int i = 0; i < n; i++){
ans = min(ans, solve(n, m, l, t, dist, i));
}
int existnum = 0;
for(int i = 0; i < n; i++){
if(t[i] > 0) existnum++;
}
if(existnum <= 1) ans = 0;
cout << ans << endl;
return 0;
}
Manuel1024