結果
| 問題 | No.788 トラックの移動 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-01-25 19:53:55 |
| 言語 | C++11(廃止可能性あり) (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,628 bytes |
| 記録 | |
| コンパイル時間 | 1,432 ms |
| コンパイル使用メモリ | 186,160 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-25 19:53:59 |
| 合計ジャッジ時間 | 3,446 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 12 WA * 2 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int inf = 1e18;
int n, m, s, dis[2007], tmp[2007], t[2007];
bool vis[2007];
struct edge
{
int v, w;
};
vector<edge> e[2007];
struct node
{
int u, w;
inline bool operator<(const node &X) const
{
return X.w < w;
}
};
priority_queue<node> q;
inline void Dij(int s)
{
for (int i = 1; i <= n; i++)
vis[i] = 0, dis[i] = inf;
dis[s] = 0;
q.push({s, 0});
while (!q.empty())
{
int u = q.top().u;
q.pop();
if (vis[u])
continue;
vis[u] = 1;
for (auto X : e[u])
{
int v = X.v, w = X.w;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
q.push({v, dis[v]});
}
}
}
return;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s;
for (int i = 1; i <= n; i++)
cin >> t[i];
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
Dij(s);
for (int i = 1; i <= n; i++)
tmp[i] = dis[i];
int res = inf;
for (int i = 1; i <= n; i++)
{
Dij(i);
int sum = 0;
for (int j = 1; j <= n; j++)
sum += 2 * dis[j] * t[j];
sum -= dis[s];
res = min(res, sum);
sum += dis[s];
for (int j = 1; j <= n; j++)
if (t[j])
res = min(res, sum - dis[j] + tmp[j]);
}
cout << res;
}
vjudge1