結果
| 問題 | No.788 トラックの移動 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-01-25 20:01:45 |
| 言語 | C++11(廃止可能性あり) (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 265 ms / 2,000 ms |
| コード長 | 1,672 bytes |
| 記録 | |
| コンパイル時間 | 2,172 ms |
| コンパイル使用メモリ | 184,328 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-25 20:01:49 |
| 合計ジャッジ時間 | 3,544 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 |
ソースコード
#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];
if (t[s])
sum -= dis[s];
res = min(res, sum);
if (t[s])
sum += dis[s];
for (int j = 1; j <= n; j++)
if (t[j])
res = min(res, sum - dis[j] + tmp[j]);
}
cout << res;
}
vjudge1