結果
| 問題 | No.788 トラックの移動 | 
| コンテスト | |
| ユーザー |  Manuel1024 | 
| 提出日時 | 2021-03-25 03:10:59 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                WA
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,926 bytes | 
| コンパイル時間 | 1,087 ms | 
| コンパイル使用メモリ | 86,364 KB | 
| 実行使用メモリ | 34,816 KB | 
| 最終ジャッジ日時 | 2024-11-26 23:54:07 | 
| 合計ジャッジ時間 | 3,936 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 11 WA * 3 | 
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
using ll = long long int;
using P = pair<ll, int>;
constexpr ll INF = 1001001001001001;
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 == 0) ans = 0;
    cout << ans << endl;
    return 0;
}
            
            
            
        