1 条题解
-
0
C++ :
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, m, p[N], a[N], b[N], w[N], ra[N], fa[N]; //vector < int > G[N]; int Get(int x) { // printf("%d\n******", x); if (fa[x] == x) return x; return fa[x] = Get(fa[x]); } inline void Merge(int x, int y) { int fx = Get(x), fy = Get(y); if (fx == fy) return; if (ra[fx] < ra[fy]) fa[fx] = fy; else { fa[fy] = fx; if (ra[fx] == ra[fy]) ++ra[fy]; } } inline bool Check(int x) { for (register int i = 1; i <= n; ++i) fa[i] = i;//, G[i].erase(G[i].begin(), G[i].end()); memset(ra, 0, sizeof(ra)); for (register int i = 1; i <= m; ++i) if (w[i] >= x) Merge(a[i], b[i]); // for (register int i = 1; i <= n; ++i) // G[Get(i)].push_back(i); for (register int i = 1; i <= n; ++i) { // writeln(i); // printf("%d %d\n", x, i); // printf("%d %d\n", i, Get(i)); if (Get(p[i]) != Get(i)) return 0; } return 1; } int main() { // freopen("wormsort.in", "r", stdin); // freopen("wormsort.out", "w", stdout); scanf("%d%d", &n, &m); for (register int i = 1; i <= n; ++i) scanf("%d", p + i); for (register int i = 1; i <= m; ++i) scanf("%d%d%d", a + i, b + i, w + i); // if (n == 4 && m == 4 && p[1] == 3 && p[2] == 2 && p[3] == 1 && p[4] == 4) puts("9"); // else puts("-1"); int lft = 0, rgh = 1e9 + 2, ans = -1; while (lft <= rgh) { int md = (lft + rgh) >> 1; if (Check(md)) { ans = md; lft = md + 1; } else rgh = md - 1; } if (ans == int(1e9 + 2)) ans = -1; printf("%d\n", ans); return 0; }
信息
- ID
- 760
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 5
- 已通过
- 5
- 上传者