結果
問題 | No.2630 Colorful Vertices and Cheapest Paths |
ユーザー |
|
提出日時 | 2024-02-16 23:21:59 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 977 ms / 2,500 ms |
コード長 | 5,380 bytes |
コンパイル時間 | 2,046 ms |
コンパイル使用メモリ | 207,828 KB |
最終ジャッジ日時 | 2025-02-19 14:53:31 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#line 2 "library/template/template.hpp"#include <bits/stdc++.h>#line 3 "library/template/macro.hpp"#define all(x) std::begin(x), std::end(x)#define rall(x) std::rbegin(x), std::rend(x)#define elif else if#define updiv(N, X) (((N) + (X) - (1)) / (X))#define sigma(a, b) ((a + b) * (b - a + 1) / 2)#define INT(...) \int __VA_ARGS__; \scan(__VA_ARGS__)#define LL(...) \ll __VA_ARGS__; \scan(__VA_ARGS__)#define STR(...) \string __VA_ARGS__; \scan(__VA_ARGS__)#define CHR(...) \char __VA_ARGS__; \scan(__VA_ARGS__)#define DOU(...) \double __VA_ARGS__; \scan(__VA_ARGS__)#define LD(...) \ld __VA_ARGS__; \scan(__VA_ARGS__)#define pb push_back#define eb emplace_back#line 3 "library/template/alias.hpp"using ll = long long;using ld = long double;using pii = std::pair<int, int>;using pll = std::pair<ll, ll>;constexpr int inf = 1 << 30;constexpr ll INF = 1LL << 60;constexpr int dx[8] = {1, 0, -1, 0, 1, -1, 1, -1};constexpr int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};constexpr int mod = 998244353;constexpr int MOD = 1e9 + 7;#line 3 "library/template/func.hpp"template <typename T>inline bool chmax(T& a, T b) { return ((a < b) ? (a = b, true) : (false)); }template <typename T>inline bool chmin(T& a, T b) { return ((a > b) ? (a = b, true) : (false)); }template <typename T, typename U>std::ostream &operator<<(std::ostream &os, const std::pair<T, U> &p) {os << p.first << " " << p.second;return os;}template <typename T, typename U>std::istream &operator>>(std::istream &is, std::pair<T, U> &p) {is >> p.first >> p.second;return is;}template <typename T>std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) {for (auto it = std::begin(v); it != std::end(v);) {os << *it << ((++it) != std::end(v) ? " " : "");}return os;}template <typename T>std::istream &operator>>(std::istream &is, std::vector<T> &v) {for (T &in : v) {is >> in;}return is;}inline void scan() {}template <class Head, class... Tail>inline void scan(Head &head, Tail &...tail) {std::cin >> head;scan(tail...);}template <class T>inline void print(const T &t) { std::cout << t << '\n'; }template <class Head, class... Tail>inline void print(const Head &head, const Tail &...tail) {std::cout << head << ' ';print(tail...);}template <class... T>inline void fin(const T &...a) {print(a...);exit(0);}#line 3 "library/template/util.hpp"struct IOSetup {IOSetup() {std::cin.tie(nullptr);std::ios::sync_with_stdio(false);std::cout.tie(0);std::cout << std::fixed << std::setprecision(12);std::cerr << std::fixed << std::setprecision(12);}} IOSetup;#line 3 "library/template/debug.hpp"#ifdef LOCAL#include <debug_print.hpp>#else#define debug(...)#endif#line 8 "library/template/template.hpp"using namespace std;#line 3 "library/data-structure/union-find.hpp"struct UnionFind {vector<int> par;UnionFind() {}explicit UnionFind(int n) : par(n, -1) {}void init(int n) { par.assign(n, -1); }int root(int x) {if (par[x] < 0)return x;elsereturn par[x] = root(par[x]);}bool issame(int x, int y) { return root(x) == root(y); }bool unite(int x, int y) {x = root(x);y = root(y);if (x == y) return false;if (par[x] > par[y]) swap(x, y);par[x] += par[y];par[y] = x;return true;}int size(int x) { return -par[root(x)]; }vector<vector<int>> groups() {vector<vector<int>> member(par.size());for (int v = 0; v < (int)par.size(); ++v) {member[root(v)].push_back(v);}vector<vector<int>> res;for (int v = 0; v < (int)par.size(); ++v) {if (!member[v].empty()) res.push_back(member[v]);}return res;}};#line 3 "B.cpp"int main() {INT(N, M);vector<vector<int>> G(N, vector<int>(0));for (int i = 0; i < M; i++) {INT(a, b);a--;b--;G[a].push_back(b);G[b].push_back(a);}vector<int> C(N);vector<int> W(10);scan(C, W);for (int i = 0; i < N; i++) {C[i]--;}vector<UnionFind> ufs(1 << 10, UnionFind(N));for (int bit = 0; bit < (1 << 10); bit++) {set<int> S;for (int i = 0; i < 10; i++) {if ((1 << i) & bit) {S.insert(i);}}for (int i = 0; i < N; i++) {for (auto &j : G[i]) {if (S.count(C[i]) && S.count(C[j])) {ufs[bit].unite(i, j);}}}}INT(Q);while (Q--) {ll ans = INF;INT(u, v);u--;v--;for (int bit = 0; bit < (1 << 10); bit++) {if (ufs[bit].issame(u, v)) {ll res = 0;for (int j = 0; j < 10; j++) {if ((1 << j) & bit) {res += W[j];}}chmin(ans, res);}}if (ans == INF) {print(-1);} else {print(ans);}}}