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
| #include <bits/stdc++.h>
using namespace std; typedef long long ll; const int N = 2e6 + 10; class UnionFind { public: vector<int> fa; vector<int> faMin; vector<int> faAnd;
UnionFind(int n) : fa(n), faMin(n, INT_MAX), faAnd(n, INT_MAX) { iota(fa.begin(), fa.end(), 0); }
int find(int x) { if (fa[x] != x) { fa[x] = find(fa[x]); } return fa[x]; }
void merge(int from, int to, int val) { int x = find(from), y = find(to); if (x == y) { faAnd[x] &= val; faMin[x] = min(faMin[x], val); return; } fa[x] = y; faAnd[y] = faAnd[x] & faAnd[y] & val; faMin[y] = min({faMin[x], faMin[y], val}); }
bool same(int x, int y) { return find(x) == find(y); } };
class Solution { public: vector<int> minimumCost(int n, vector<vector<int>>& edges, vector<vector<int>>& queries) { UnionFind uf(n); for (auto& e : edges) { uf.merge(e[0], e[1], e[2]); }
vector<int> ans(queries.size()); for (size_t i = 0; i < queries.size(); ++i) { int x = queries[i][0], y = queries[i][1];
if (x == y) { ans[i] = 0; continue; } if (!uf.same(x, y)) { ans[i] = -1; continue; } int f = uf.find(x); ans[i] = min(uf.faMin[f], uf.faAnd[f]); } return ans; } };
int main() { Solution s; vector<vector<int>> edges{{0, 1, 7}, {1, 3, 7}, {1, 2, 1}}; vector<vector<int>> query{{0, 3}, {3, 4}}; vector<int> ans = s.minimumCost(5, edges, query); for (auto it: ans) { cout << it << ' '; }
return 0; }
|