1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <bits/stdc++.h>
#define int int64_t
const int kMaxN = 75, kMaxS = (1 << 18);
int n, m, a, b, cnt, tot; int g[kMaxN][kMaxN], id[kMaxN], f[kMaxN][kMaxS]; bool vis[kMaxN]; std::vector<int> vec;
void dfs(int u) { vec.emplace_back(u), vis[u] = 1; for (int i = 1; i <= n; ++i) if (g[u][i] == a && !vis[i]) dfs(i); }
void dijkstra() { static bool vis[kMaxN][kMaxS] = {0}; memset(f, 0x3f, sizeof(f)); std::priority_queue<std::tuple<int, int, int>> q; f[1][0] = 0, q.emplace(0, 1, 0); for (; !q.empty();) { auto [d, i, s] = q.top(); q.pop(); if (vis[i][s]) continue; vis[i][s] = 1; for (int j = 1; j <= n; ++j) { if (!g[i][j]) continue; int t = s; if (id[j] < cnt) { if (s >> id[j] & 1) continue; if (id[j] == id[i]) { if (g[i][j] == a && f[j][t] > f[i][s] + g[i][j]) { f[j][t] = f[i][s] + g[i][j], q.emplace(-f[j][t], j, t); } } else { if (id[i] < cnt) t |= (1 << id[i]); if (f[j][t] > f[i][s] + g[i][j]) { f[j][t] = f[i][s] + g[i][j], q.emplace(-f[j][t], j, t); } } } else { if (id[j] == id[i]) { if (g[i][j] == a && f[j][t] > f[i][s] + g[i][j]) { f[j][t] = f[i][s] + g[i][j], q.emplace(-f[j][t], j, t); } } else { if (id[i] < cnt) t |= (1 << id[i]); if (f[j][t] > f[i][s] + g[i][j]) { f[j][t] = f[i][s] + g[i][j], q.emplace(-f[j][t], j, t); } } } } } }
void dickdreamer() { std::cin >> n >> m >> a >> b; for (int i = 1; i <= m; ++i) { int u, v, w; std::cin >> u >> v >> w; g[u][v] = g[v][u] = w; } for (int i = 1; i <= n; ++i) { if (vis[i]) continue; dfs(i); if (vec.size() >= 4) { for (auto x : vec) id[x] = tot; ++cnt, ++tot; } vec.clear(); } std::fill_n(vis + 1, n, 0); for (int i = 1; i <= n; ++i) { if (vis[i]) continue; dfs(i); if (vec.size() <= 3) { for (auto x : vec) id[x] = tot; ++tot; } vec.clear(); } dijkstra(); for (int i = 1; i <= n; ++i) std::cout << *std::min_element(f[i], f[i] + (1 << cnt)) << ' '; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|