[BZOJ2654][tree][二分+Kruskal]
2017-03-29 18:48
274 查看
[BZOJ2654][tree][二分+Kruskal]
题目大意:
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。思路:
可以给每条白色边都加一个权值,这个权值越大,选的白边就越少,反之就越多。对于这个权值二分就好了,然后再做一遍最小生成树。代码:
#include <bits/stdc++.h> using namespace std; const int Maxn = 100010, INF = 200; struct Edge { int u, v, x, c; } edge[Maxn]; int fa[Maxn], uu[Maxn], vv[Maxn], c[Maxn], xx[Maxn]; int n, m, ned; inline bool cmp(Edge a, Edge b) { return a.x == b.x ? a.c < b.c : a.x < b.x; } inline int getf(int x) { return fa[x] = (x == fa[x] ? x : getf(fa[x])); } inline void read(int &x) { x = 0; static char c; for (; !(c >= '0' && c <= '9'); c = getchar()); for (; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = getchar()); } int val, chosen; inline bool check(int x) { for (int i = 0; i < m; i++) { edge[i].u = uu[i], edge[i].v = vv[i], edge[i].c = c[i], edge[i].x = xx[i]; if (!c[i]) edge[i].x += x; } sort(edge, edge + m, cmp); for (int i = 1; i <= n; i++) fa[i] = i; val = chosen = 0; int i = 0, fu, fv; while (i < m) { fu = getf(edge[i].u), fv = getf(edge[i].v); if (fu != fv) { val += edge[i].x; if (!edge[i].c) ++chosen; fa[fu] = fv; } i++; } return chosen >= ned; } int main(void) { read(n), read(m), read(ned); for (int i = 0; i < m; i++) { read(uu[i]), read(vv[i]), read(xx[i]), read(c[i]); uu[i]++, vv[i]++; } int L = -INF, R = INF, mid, total; while (L <= R) { mid = (L + R) >> 1; if (check(mid)) L = mid + 1, total = val - mid * ned; else R = mid - 1; } cout << total << endl; return 0; }
完。
By g1n0st
相关文章推荐
- bzoj2654 tree(二分+kruskal)
- BZOJ 2654: tree kruskal 二分
- 【BZOJ】2654 tree 二分+kruskal
- [BZOJ2654]tree(二分+Kruskal)
- BZOJ 2654 tree 详解(最小生成树 kruskal 二分)
- BZOJ[2654]Tree 二分+Kruskal
- BZOJ 2654 tree 二分答案+Kruskal
- [bzoj2654]tree_二分_kruskal
- BZOJ 2654: tree 最小生成树+二分
- BZOJ 2654 tree(二分答案+最小生成树)
- 【二分+最小生成树】BZOJ2654[tree]题解
- 【二分+最小生成树】BZOJ2654 tree
- 【bzoj2654】tree 二分+Kruscal
- bzoj 2654 tree (二分 + 最小生成树)
- BZOJ 2654 tree - 二分+最小生成树
- [WQS二分] BZOJ2654:tree
- [bzoj2654]tree 二分+最小生成树
- BZOJ 2654: tree( 二分 + MST )
- 【BZOJ2654】tree【二分】【最小生成树】
- bzoj2654: tree(二分+最小生成树)