結果
問題 | No.1442 I-wate Shortest Path Problem |
ユーザー |
|
提出日時 | 2021-01-28 20:11:11 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,832 bytes |
コンパイル時間 | 2,670 ms |
コンパイル使用メモリ | 215,560 KB |
最終ジャッジ日時 | 2025-01-18 08:34:42 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 2 |
other | AC * 1 WA * 24 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;using ld = long double;using VI = vector<int>;using VL = vector<ll>;using VS = vector<string>;template<class T> using PQ = priority_queue<T, vector<T>, greater<T>>;#define FOR(i,a,n) for(int i=(a);i<(n);++i)#define eFOR(i,a,n) for(int i=(a);i<=(n);++i)#define rFOR(i,a,n) for(int i=(n)-1;i>=(a);--i)#define erFOR(i,a,n) for(int i=(n);i>=(a);--i)#define SORT(a) sort(a.begin(),a.end())#define rSORT(a) sort(a.rbegin(),a.rend())#define fSORT(a,f) sort(a.begin(),a.end(),f)#define all(a) a.begin(),a.end()#define out(y,x) ((y)<0||h<=(y)||(x)<0||w<=(x))#define tp(a,i) get<i>(a)#ifdef _DEBUG#define line cout << "-----------------------------\n"#define stop system("pause")#define debug(x) print(x)#endifconstexpr ll INF = 1000000000;constexpr ll LLINF = 1LL << 60;constexpr ll mod = 1000000007;constexpr ll MOD = 998244353;constexpr ld eps = 1e-10;constexpr ld pi = 3.1415926535897932;template<class T>inline bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; }return false; }template<class T>inline bool chmin(T& a, const T& b) { if (a > b) { a = b; return true; }return false; }inline void init() { cin.tie(nullptr); cout.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); }template<class T>inline istream& operator>>(istream& is, vector<T>& v) { for (auto& a : v)is >> a; return is; }template<class T, class U>inline istream& operator>>(istream& is, pair<T, U>& p) { is >> p.first >> p.second; return is; }template<class T>inline vector<T> vec(size_t a) { return vector<T>(a); }template<class T>inline vector<T> defvec(T def, size_t a) { return vector<T>(a, def); }template<class T, class... Ts>inline auto vec(size_t a, Ts... ts) { return vector<decltype(vec<T>(ts...))>(a, vec<T>(ts...)); }template<class T, class... Ts>inline auto defvec(T def, size_t a, Ts... ts) { return vector<decltype(defvec<T>(def, ts...))>(a, defvec<T>(def, ts...)); }template<class T>inline void print(const T& a) { cout << a << "\n"; }template<class T, class... Ts>inline void print(const T& a, const Ts&... ts) { cout << a << " "; print(ts...); }template<class T>inline void print(const vector<T>& v) { for (int i = 0; i < v.size(); ++i)cout << v[i] << (i == v.size() - 1 ? "\n" : " "); }template<class T>inline void print(const vector<vector<T>>& v) { for (auto& a : v)print(a); }inline string reversed(const string& s) { string t = s; reverse(all(t)); return t; }template<class T>inline T sum(const vector<T>& a, int l, int r) { return a[r] - (l == 0 ? 0 : a[l - 1]); }template<class T>inline void END(T s) { print(s); exit(0); }void END() { exit(0); }int main() {init();int n, k; cin >> n >> k;vector<vector<pair<int, int>>> g(n + k);FOR(i, 0, n - 1) {int a, b, c; cin >> a >> b >> c;--a, --b;g[a].emplace_back(b, c);g[b].emplace_back(a, c);}const int logn = log2(n);VI dep(n);VL dis(n, LLINF);auto nxt = defvec<int>(-1, logn + 1, n);auto dfs = [&](auto&& f, int cur, int par, int cur_dep, ll cur_dis)->void {dep[cur] = cur_dep;dis[cur] = cur_dis;nxt[0][cur] = par;for (auto [to, cost] : g[cur]) {if (to == par)continue;f(f, to, cur, cur_dep + 1, cur_dis + cost);}};dfs(dfs, 0, -1, 0, 0);FOR(j, 0, logn)FOR(i, 0, n)if (nxt[j][i] != -1)nxt[j + 1][i] = nxt[j][nxt[j][i]];auto lca = [&](int a, int b)->int {if (dis[a] > dis[b])swap(a, b);int d = dep[b] - dep[a];eFOR(j, 0, logn)if (d & (1 << j))b = nxt[j][b];if (a == b)return a;erFOR(j, 0, logn)if (nxt[j][a] != nxt[j][b]) {a = nxt[j][a], b = nxt[j][b];}return nxt[0][a];};auto dist = [&](int u, int v) {return dis[u] + dis[v] - dis[lca(u, v)] * 2;};VI p(k);FOR(i, 0, k) {int m; cin >> m >> p[i];FOR(j, 0, m) {int x; cin >> x;--x;g[n + i].emplace_back(x, 0);g[x].emplace_back(n + i, p[i]);}}auto dp = defvec<ll>(LLINF, k, n + k);PQ<pair<ll, int>> dik;FOR(i, 0, k) {dp[i][n + i] = 0;dik.emplace(0, n + i);while (!dik.empty()) {auto [d, cur] = dik.top();dik.pop();if (dp[i][cur] < d)continue;for (auto [to, cost] : g[cur]) {if (!chmin(dp[i][to], d + cost))continue;dik.emplace(d + cost, to);}}}int q; cin >> q;while (q--) {int u, v; cin >> u >> v;--u, --v;ll ans = LLINF;FOR(i, 0, k)chmin(ans, dp[i][u] + dp[i][v] + p[i]);print(ans);}return 0;}