http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640

1640 天气晴朗的魔法

题目来源: 原创
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注

这样阴沉的天气持续下去,我们不免担心起他的健康。

 
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 6
1 2 3
1 3 1
1 4 7
2 3 4
2 4 5
3 4 6
Output示例
12
 一道最大生成树的题目,对于这个最大魔法链值,我们显然可以通过二分出来他的最小值,然后类似于最小生成树的贪心做法,我们从满足条件的权值最大的边开始运行kruskal,由于要求只能有N-1条魔法链,所以相当于是kruskal只不过将边倒序枚举。
 第一次直接把l=0,r=INT_MAX,结果T了最后一个点,无奈做了一些优化,找到最大最小值赋给l,r然后就A了。
 
不过后来看别人题解发现好像没人用二分,可以先求一遍kruskal找到最后加入的边的权值,这就使得最大权值最小了,然后在倒序求一遍kruskal,只要当前边权值不大于之前求得的那个值就好啦。
 #include<bits/stdc++.h>   //二分650ms
using namespace std;
#define LL long long
struct Edge
{
int u,v,w;
bool operator<(const Edge &t)const{
return w<t.w;
}
}e[];
int f[];
int getf(int v){return f[v]==v?f[v]:f[v]=getf(f[v]);}
bool ok(int k,int N,int M)
{
for(int i=;i<=N;++i) f[i]=i;
for(int i=;i<M&&e[i].w<=k;i++){
int fu=getf(e[i].u),fv=getf(e[i].v);
if(fv!=fu){
N--;
f[fv]=fu;
}
if(N==) return ;
}
return ;
}
int main()
{
int N,M,i,j,l=,r=;
cin>>N>>M;
for(i=;i<M;++i){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
l=min(l,e[i].w);
r=max(r,e[i].w);
}
sort(e,e+M);
LL ans=;
while(l<r){
int mid=l+((r-l)>>);
if(ok(mid,N,M)){
r=mid;
}
else{
l=mid+;
}
}
for(int i=;i<=N;++i) f[i]=i;
Edge e1{-,-,l};
int ed=upper_bound(e,e+M+,e1)-e;
for(int i=ed;i>=;--i){
if(e[i].w>l) continue;
int fu=getf(e[i].u),fv=getf(e[i].v);
if(fv!=fu){
ans+=e[i].w;
N--;
f[fv]=fu;
}
if(N==) break;
}
printf("%lld\n",ans);
return ;
}
 #include<bits/stdc++.h>  //300ms
using namespace std;
#define LL long long
struct Edge
{
int u,v,w;
bool operator<(const Edge &t)const{
return w<t.w;
}
}e[];
int f[];
int getf(int v){return f[v]==v?f[v]:f[v]=getf(f[v]);}
int ok(int k,int N,int M)
{
for(int i=;i<=N;++i) f[i]=i;
for(int i=;i<M;i++){
int fu=getf(e[i].u),fv=getf(e[i].v);
if(fv!=fu){
N--;
f[fv]=fu;
}
if(N==) return i;
}
return -;
}
int main()
{
ios::sync_with_stdio(false);
int N,M,i,j,l=,r=;
cin>>N>>M;
for(i=;i<M;++i){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e,e+M);
LL ans=;
l=ok(,N,M);
while(l<M&&e[l+].w==e[l].w) l++;
for(int i=;i<=N;++i) f[i]=i;
for(int i=l;i>=;--i){
int fu=getf(e[i].u),fv=getf(e[i].v);
if(fv!=fu){
ans+=e[i].w;
N--;
f[fv]=fu;
}
if(N==) break;
}
printf("%lld\n",ans);
return ;
}

51nod 1640 MST+二分的更多相关文章

  1. 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了 ...

  2. 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分

    天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...

  3. 51nod 1640 天气晴朗的魔法 最小生成树

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 题解: 先求最小生成树,记录最大边. 然后求最大生成树 ...

  4. 51nod 1640 天气晴朗的魔法

    题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗 ...

  5. 51nod 1267【二分】

    思路: 首先我们能够很容易地想到,4个数的和,拆成两两相加:a+b=-c-d; 我们也能很轻松地求出两两之和,但是呢..不同的和会存在相同的值相加,所以还要排除这个条件.具体操作就是标记一下,然后将和 ...

  6. 51nod 1272【二分+RMQ】

    思路: 这题不能说是长见识,倒是第一次写这么富有套路的题,倒着来,二分区间嘛,这个很简单啊,二分的条件查询一个当前区间的最小值是不是比那个特定的值小,一步步缩小,这就是二分嘛,然后查询用线段树的RMQ ...

  7. 51nod——1640 天气晴朗的魔法 有边权限制的最大生成树

    好好读题嗷:“所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大.” 第一条件是生成树的最大边权更小,第二条件是在最大边权的限制下搞一个最大生成树. 至于最大生成树,如 ...

  8. BZOJ 2654 & 玄学二分+MST

    题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一 ...

  9. [BZOJ2654]tree(二分+MST)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...

随机推荐

  1. Java中的字符串不变性

    原文链接:http://www.programcreek.com/2009/02/diagram-to-show-java-strings-immutability/ (图片出处和内容参照) 1.声明 ...

  2. An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

    与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: TCP ...

  3. 关于\r和\n的区别

    回车和换行来源 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两 ...

  4. C# 事件浅析

    前言 对于搞.net的朋友来说,经常会遇到关于事件和委托的问题:事件与委托有什么关系?事件的本质是什么?委托的本质又是什么?由于.net 做了大量的封装,对于初学者,这两个概念确实不怎么好理解.事件是 ...

  5. NGUI如何使用汉字

    1:准备好字体文件,就是ttf后缀名的那些.. 2:在第一个红线部分,将下拉框选择为Unity,在后面的字体里面选择第一步准备好的字体. 3:创建UILabel,widget里面的Color才是字体的 ...

  6. Google ProtocolBuffer

    https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html 1. Protocol Buffers 简介 Protocol Buff ...

  7. Entity FrameWork 配置 之连接字符串隐藏或重用

    C/S项目中使用EF,默认回生成app.config文件夹,软件打包安装成功之后就回生成一个对应exe.config.里面会包含配置的一些信息. 这里介绍给大家一种隐藏连接字符串的方式. 代码如下: ...

  8. 双camera景深计算 (1)

    http://www.52rd.com/S_TXT/2016_6/TXT85047.HTM?WebShieldDRSessionVerify=Wz3h6srvu76qRI4MFxK8 前面介绍了双ca ...

  9. shell脚本 入门 —— 符号篇

    shell Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive). Shell还有一种执行命令的方式称 ...

  10. react 关于this.setState使用时,第一次无法获取数据,第二次获取的数据是第一次触发的疑问

    我使用的是antd组件, compareClickFn(orderCodes, fileNames) { printLog("orderCodes----------"+ orde ...