From d4930597c497880238b131868cbb8fbc7387f4f6 Mon Sep 17 00:00:00 2001 From: Ren Baoshuo Date: Fri, 16 Jul 2021 10:23:57 +0800 Subject: [PATCH] =?UTF-8?q?P2502=20[HAOI2006]=E6=97=85=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R53268659 --- Luogu/problem/P2502/P2502.cpp | 102 ++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Luogu/problem/P2502/P2502.cpp diff --git a/Luogu/problem/P2502/P2502.cpp b/Luogu/problem/P2502/P2502.cpp new file mode 100644 index 00000000..be15f072 --- /dev/null +++ b/Luogu/problem/P2502/P2502.cpp @@ -0,0 +1,102 @@ +#include + +using namespace std; + +struct edge { + int from, to, v; + + bool operator<(const edge& x) const { + return v < x.v; + } +} e[5005]; + +struct data { + int a, b; + + data() { + a = b = 0; + } + data(int _a, int _b) { + int g = __gcd(_a, _b); + a = _a / g; + b = _b / g; + } + + bool operator<(const data& x) const { + return a * x.b < b * x.a; + } + bool operator>(const data& x) const { + return a * x.b > b * x.a; + } + bool operator==(const data& x) const { + return a * x.b == b * x.a; + } +} ans(100000, 1); + +int n, m, s, t, fa[510], rnk[510]; + +int find(int x) { + if (fa[x] != x) return find(fa[x]); + return x; +} + +void merge(int x, int y) { + x = find(x); + y = find(y); + if (x == y) return; + if (rnk[x] < rnk[y]) swap(x, y); + fa[y] = x; + rnk[x] = max(rnk[x], rnk[y] + 1); +} + +bool check(int l, int r) { + for (int i = 1; i <= n; i++) { + fa[i] = i, rnk[i] = 1; + } + for (int i = l; i <= r; i++) { + merge(e[i].from, e[i].to); + } + return find(s) == find(t); +} + +int main() { + cin >> n >> m; + for (int i = 1; i <= m; i++) { + cin >> e[i].from >> e[i].to >> e[i].v; + } + cin >> s >> t; + sort(e + 1, e + 1 + m); + for (int i = 1; i <= m; i++) { + if (e[i].v != e[i - 1].v) { + int l = i - 1; + int r = m + 1; + int mid = l + r >> 1; + while (data(e[mid].v, e[i].v) > ans) { + r = mid; + mid = (l + r) >> 1; + } + if (!check(i, r)) continue; + while (l + 1 < r) { + mid = (l + r) >> 1; + if (check(i, mid)) { + r = mid; + } else { + l = mid; + } + } + if (data(e[r].v, e[i].v) < ans) { + ans = data(e[r].v, e[i].v); + } + } + } + if (ans.a == 100000) { + cout << "IMPOSSIBLE" << endl; + } else { + cout << ans.a; + if (ans.b != 1) { + cout << '/' << ans.b; + } + cout << endl; + } + return 0; +}