51Nod - 1640 生成树
来源:互联网 发布:支付宝与淘宝的关系 编辑:程序博客网 时间:2024/06/06 03:50
题意:
51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动。
N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接起来,形成一个魔法阵。
魔法链是做法成功与否的关键。每一条魔法链都有一个魔力值V,魔法最终的效果取决于阵中所有魔法链的魔力值的和。
由于逆天改命的魔法过于暴力,所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大。
现在给定魔法师人数N,魔法链数目M。求此魔法阵的最大效果。
Input
两个正整数N,M。(1 <= N <= 10^5, N <= M <= 2 * 10^5)接下来M行,每一行有三个整数A, B, V。(1 <= A, B <= N, INT_MIN <= V <= INT_MAX)保证输入数据合法。
Output
输出一个正整数R,表示符合条件的魔法阵的魔力值之和。
Input示例
4 61 2 31 3 11 4 72 3 42 4 53 4 6
Output示例
12
思路:
一开始想偏了,写了个二分的复杂度过不去,于是看了题解。
思路就是先求一遍最小生成树,因为按照题目的要求,得到的生成树的边的最大值要最小,这时候首要条件,那么显然最终答案所有的边肯定都要不能大于最小生成树边的最大值,所以先求一遍MST得到边的上界,然后再依照这个上界求一遍最大生成树就是答案。
代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 2e5 + 10;int n, m;int pa[MAXN];struct Edge { int u, v, w; bool operator < (const Edge &b) const { return w > b.w; }}es[MAXN];int Find(int x) { return pa[x] == x ? x : pa[x] = Find(pa[x]);}ll kruskal(int pos) { ll res = 0, cnt = 0; for (int i = 1; i <= n; i++) pa[i] = i; for (int i = pos; i <= m; i++) { Edge e = es[i]; int px = Find(e.u), py = Find(e.v); if (px != py) { pa[px] = py; res += e.w; ++cnt; } } if (cnt != n - 1) return -1; return res;}ll bin(int l, int r) { ll res; while (l < r) { int m = (l + r) >> 1; ll tmp = kruskal(m); //cout << l << " " << r << endl; //printf("%I64d\n", res); if (tmp != -1) l = m; else r = m - 1; if (tmp != -1) res = tmp; } return res;}int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d%d", &es[i].u, &es[i].v, &es[i].w); } sort(es + 1, es + 1 + m); printf("%I64d\n", bin(1, m)); return 0;}
0 0
- 51Nod - 1640 生成树
- 51nod 1640 天气晴朗的魔法(最小生成树)
- 51nod--1212 最小生成树
- 51NOD 1212 最小生成树模板
- 51NOD 1640 天气晴朗的魔法(二分+最大生成树)
- 51NOD 1640 天气晴朗的魔法 最小生成树 kuskal
- 51nod 1640 天气晴朗的魔法【二分+最大生成树】
- 51nod 1640 天气晴朗的魔法【最小生成树概念】
- 51nod 1640 天气晴朗的魔法 prime队列+最小生成树+最大生成树+邻接表
- 51nod 1640 天气晴朗的魔法 【二分枚举最大生成树】or【最小&&最大 生成树】
- 51nod 1212 无向图最小生成树
- 51 nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod:1212 无向图最小生成树
- 51Nod 1212 无向图最小生成树
- MySQLReport结果详解
- shell 脚本中双引号、单引号、反引号的区别
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复-------解题总结
- [Node.js]事件循环
- Android自定义控件之自定义圆形进度条
- 51Nod - 1640 生成树
- 新春第六波:《今日头条》推荐-小程序极速开发用逐浪、高端CMS用真棒
- 17 - 05 - 09 大学第一学期给理想、尊严与未来交的答卷
- 读《黑客与画家》感想(4)
- synx的使用及出现的问题
- 海康 rtsp 主流 和 辅流的一个特点
- Array238ProductOfArrayExceptSelf
- spring cloud-使用feign来消费Restful服务同时加入Ribbon来实现负载均衡
- 2016年工作总结