結果
問題 | No.2630 Colorful Vertices and Cheapest Paths |
ユーザー | Yu_212 |
提出日時 | 2024-02-16 21:55:19 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 239 ms / 2,500 ms |
コード長 | 1,672 bytes |
コンパイル時間 | 2,983 ms |
コンパイル使用メモリ | 252,712 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-09-28 20:10:21 |
合計ジャッジ時間 | 7,242 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; using i64 = long long; #define var auto struct unionfind { vector<int> s; unionfind(int n): s(n, -1) { } int root(int u) { return s[u] >= 0 ? (s[u] = root(s[u])) : u; } void unite(int u, int v) { u = root(u); v = root(v); if (u == v) return ; if (s[u] < s[v]) swap(u, v); s[v] += s[u]; s[u] = v; } }; int main() { cin.tie(0)->sync_with_stdio(false); int n, m; cin >> n >> m; vector<int> a(m); vector<int> b(m); for (int i = 0; i < m; i++) { cin >> a[i] >> b[i]; a[i]--, b[i]--; } vector<int> c(n); for (int i = 0; i < n; i++) { cin >> c[i]; c[i]--; } vector<ll> w(10); for (int i = 0; i < 10; i++) { cin >> w[i]; } int q; cin >> q; vector<int> us(q); vector<int> vs(q); for (int i = 0; i < q; i++) { cin >> us[i] >> vs[i]; us[i]--, vs[i]--; } const ll inf = 1e18; vector<ll> ans(q, inf); for (int i = 1; i < 1024; i++) { ll cost = 0; for (int j = 0; j < 10; j++) { if (i >> j & 1) cost += w[j]; } unionfind uf(n); for (int j = 0; j < m; j++) { if ((i >> c[a[j]] & 1) && (i >> c[b[j]] & 1)) { uf.unite(a[j], b[j]); } } for (int j = 0; j < q; j++) { if (uf.root(us[j]) == uf.root(vs[j])) { ans[j] = min(ans[j], cost); } } } for (int i = 0; i < q; i++) { cout << (ans[i]<inf?ans[i]:-1) << "\n"; } }