結果
問題 | No.1812 Uribo Road |
ユーザー |
![]() |
提出日時 | 2021-12-30 23:52:59 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,622 bytes |
コンパイル時間 | 2,711 ms |
コンパイル使用メモリ | 210,080 KB |
最終ジャッジ日時 | 2025-01-27 07:51:24 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 WA * 1 |
other | AC * 10 WA * 20 |
ソースコード
//焼き鈍し#include <bits/stdc++.h>#include <ctime>#include <cstdlib>#define rep(i, l, n) for (int i = (l); i < (n); i++)using namespace std;using Pair = pair<int, int>;template <class T>using V = vector<T>;template <class T>using VV = V<V<T> >;const int inf = 2000000000;using chrono::duration_cast;using chrono::milliseconds;using chrono::system_clock;inline int getnow() { return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count(); }VV<int> dijkstra(int n, VV<int>& edge, V<int>& R, VV<Pair>& route) {VV<int> dist(n, V<int>(0));V<int> st = { 0,n - 1 };rep(i, 0, R.size()) {st.push_back(edge[R[i]][0]);st.push_back(edge[R[i]][1]);}rep(i, 0, st.size()) {int k = st[i];V<int> di(n, -1);priority_queue<Pair, V<Pair>, greater<Pair> > pq;pq.push({ 0,k });int cnt = 0;while (pq.size() && cnt < n) {Pair p = pq.top(); pq.pop();int d = p.first; int v = p.second;if (di[v] == -1) {cnt++;di[v] = d;rep(j, 0, route[v].size()) {Pair p = { d + route[v][j].second,route[v][j].first };pq.push(p);}}}dist[k] = di;}return dist;}int main(void) {srand(time(NULL));int start = getnow();int N, M, K; cin >> N >> M >> K;V<int> R(K);rep(i, 0, K) {cin >> R[i]; R[i] -= 1;}VV<int> edge(M, V<int>(3));VV<Pair> route(N, V<Pair>(0));rep(i, 0, M) {rep(j, 0, 3) {cin >> edge[i][j];}edge[i][0] -= 1; edge[i][1] -= 1;route[edge[i][0]].push_back({ edge[i][1],edge[i][2] });route[edge[i][1]].push_back({ edge[i][0],edge[i][2] });}int rsum = 0;rep(i, 0, R.size()) {rsum += edge[R[i]][2];}VV<int> dist = dijkstra(N, edge, R, route);V<int> p = {};rep(i, 0, K) {p.push_back(i);}int ans = inf; int tans = inf;while (getnow() - start < 4900) {int x = rand() % K; int y = rand() % K;int tmp = p[x];p[x] = p[y];p[y] = tmp;V<int> q = p;VV<int> dp(K, V<int>(2, inf));rep(i, 0, 2) {dp[0][i] = rsum + dist[0][edge[R[p[0]]][i]];}rep(k, 0, K - 1) {int s = p[k]; int t = p[k + 1];rep(i, 0, 2) {rep(j, 0, 2) {int d = dp[k][i ^ 1] + dist[edge[R[s]][i]][edge[R[t]][j]];if (dp[k + 1][j] > d) {dp[k + 1][j] = d;}}}}int a = inf;rep(j, 0, 2) {int d = dp[K - 1][j ^ 1] + dist[edge[R[p[K - 1]]][j]][N - 1];if (a > d) {a = d;}}if (ans > a) {ans = a;}else if (rand() % 1000 != 999) {rep(i, 0, K) {p[i] = q[i];}}else {tans = ans;ans = a;}}if (ans > tans) {ans = tans;}cout << ans << endl;return 0;}