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. Cookie 入门

    位于 javax.servlet.http 包下 1. HTTP 协议与 Cookie 关于 Cookie Cookie 是 HTTP 协议制定的!先由服务器保存 Cookie 到浏览器, 在下次浏览 ...

  2. 转!java产生不重复随机数

    private static void testC(int sz) { long startTime = System.currentTimeMillis(); //开始测试时间 Random rd ...

  3. win8 内置管理员账号既能使用metro应用又能使用默认共享

    一.内置管理员账号打开METRO应用 1.按WIN+R 弹出运行框. 2.输入gpedit.msc点确定,打开本地组策略编辑器. 3.逐级选择"计算机配置","Windo ...

  4. export,import ,export default的区别

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  5. Linux系统下实时监控网口速率的shell脚本

    修改后的脚本文件 #!/bin/bash #Modified by lifei4@datangmobile.cn echo ===DTmobile NetSpeedMonitor=== sleep 1 ...

  6. Redis核心解读(转)

    原文:Redis核心解读 Redis是知名的键值数据库,它广泛用于缓存系统.关于Redis的信息已经不用我多介绍了.这个系统的Redis文章主要从另外一个角度关注,Redis作为一个开源项目,短短2W ...

  7. django_上传文件

    要求:  写一个文件上传:如果文件名字重复,不要覆盖,并且放到项目根路径的media文件夹下 def upload(request): if request.method == "GET&q ...

  8. JetBrains IntelliJ IDEA 15 Ultimate Edition版本激活破解

        由于JetBrains系列新版本注册激活发生了变化,所以原来的激活方式已经不能在使用. 只能用新的方式来破解了.此方式支持所有系列的新版版.包括IDEA15,PHPSTORM10,WEBSTO ...

  9. Ubuntu启动文件破坏启动恢复方法

    reboot后主机登录显示如下图: 解决步骤: 1.fs0:(回车) 2.edit startup.nsh 3.添加下面字段: fs0: cd EFI/ubuntu grubx64.efi 4.重启即 ...

  10. 使用Vue.js初次真正项目开发-2018/07/14

    一.组件化 使用Vue.js进行开发,按照MVVM模式,围绕数据为核心,进行开发. 开发过程根据业务和功能组件化,组件化一方面让我们开发思路更加清晰,另一方面对于数据的处理和控制变得更加简单,毕竟一个 ...