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. springMvc获取特殊值

    1.获取数组

  2. golang redis的模式订阅

    c := redisPool.Get() psc := redis.PubSubConn{c} psc.PSubscribe("aa*") for { switch v := ps ...

  3. SQL JOIN使用方法

    (转自W3School相关教程:http://www.w3school.com.cn,W3School是不错的在线教程,简洁高效!) 下面列出不同的SQL JOIN类型,以及他们之间的差异: JOIN ...

  4. appium 自动化测试案例

    原文地址http://www.cnblogs.com/tobecrazy/p/4579631.html 原文地址http://www.cnblogs.com/tobecrazy/ 该博主有很多干货,可 ...

  5. beego——表单验证

    表单验证是用于数据验证和错误收集的模块. 安装: go get github.com/astaxie/beego/validation 测试: go test github.com/astaxie/b ...

  6. 应用服务器支持 HTTPS

    当前业务系统中支持 HTTP 协议和 HTTPS 协议的 Web.config 文件并不相同.在默认情况下,不能同时支持 HTTPS 和 HTTP 协议. 生成部署包 若需支持 HTTPS 协议,请将 ...

  7. LeetCode:下一个更大元素I【31】

    LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...

  8. Getting Started with Rails (1)

    按照官网http://guides.rubyonrails.org/getting_started.html上学习了一下例子.在过程中有很多刚开始没理解的地方,写下来. 首先,建立了一个resourc ...

  9. CodeForces - 995E Number Clicker (双向BFS)

    题意:给出u,v,p,对u可以进行三种变化: 1.u=(u+1)%p ; 2.u = (u+p-1)%p;  3.u = 模p下的逆元.问通过几步可以使u变成v,并且给出每一步的操作. 分析:朴素的b ...

  10. flex 客户端缓存SharedObject

    读取缓存: usernameSO = SharedObject.getLocal('username'); if (usernameSO) { usernameSOAL = usernameSO.da ...