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


这样阴沉的天气持续下去,我们不免担心起他的健康。
两个正整数N,M。(1 <= N <= 10^5, N <= M <= 2 * 10^5) 接下来M行,每一行有三个整数A, B, V。(1 <= A, B <= N, INT_MIN <= V <= INT_MAX) 保证输入数据合法。
输出一个正整数R,表示符合条件的魔法阵的魔力值之和。
4 6
1 2 3
1 3 1
1 4 7
2 3 4
2 4 5
3 4 6
12
#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+二分的更多相关文章
- 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了 ...
- 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分
天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动. N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...
- 51nod 1640 天气晴朗的魔法 最小生成树
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 题解: 先求最小生成树,记录最大边. 然后求最大生成树 ...
- 51nod 1640 天气晴朗的魔法
题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日开展了主题为“天气晴朗 ...
- 51nod 1267【二分】
思路: 首先我们能够很容易地想到,4个数的和,拆成两两相加:a+b=-c-d; 我们也能很轻松地求出两两之和,但是呢..不同的和会存在相同的值相加,所以还要排除这个条件.具体操作就是标记一下,然后将和 ...
- 51nod 1272【二分+RMQ】
思路: 这题不能说是长见识,倒是第一次写这么富有套路的题,倒着来,二分区间嘛,这个很简单啊,二分的条件查询一个当前区间的最小值是不是比那个特定的值小,一步步缩小,这就是二分嘛,然后查询用线段树的RMQ ...
- 51nod——1640 天气晴朗的魔法 有边权限制的最大生成树
好好读题嗷:“所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大.” 第一条件是生成树的最大边权更小,第二条件是在最大边权的限制下搞一个最大生成树. 至于最大生成树,如 ...
- BZOJ 2654 & 玄学二分+MST
题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一 ...
- [BZOJ2654]tree(二分+MST)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...
随机推荐
- springMvc获取特殊值
1.获取数组
- golang redis的模式订阅
c := redisPool.Get() psc := redis.PubSubConn{c} psc.PSubscribe("aa*") for { switch v := ps ...
- SQL JOIN使用方法
(转自W3School相关教程:http://www.w3school.com.cn,W3School是不错的在线教程,简洁高效!) 下面列出不同的SQL JOIN类型,以及他们之间的差异: JOIN ...
- appium 自动化测试案例
原文地址http://www.cnblogs.com/tobecrazy/p/4579631.html 原文地址http://www.cnblogs.com/tobecrazy/ 该博主有很多干货,可 ...
- beego——表单验证
表单验证是用于数据验证和错误收集的模块. 安装: go get github.com/astaxie/beego/validation 测试: go test github.com/astaxie/b ...
- 应用服务器支持 HTTPS
当前业务系统中支持 HTTP 协议和 HTTPS 协议的 Web.config 文件并不相同.在默认情况下,不能同时支持 HTTPS 和 HTTP 协议. 生成部署包 若需支持 HTTPS 协议,请将 ...
- LeetCode:下一个更大元素I【31】
LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...
- Getting Started with Rails (1)
按照官网http://guides.rubyonrails.org/getting_started.html上学习了一下例子.在过程中有很多刚开始没理解的地方,写下来. 首先,建立了一个resourc ...
- 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 ...
- flex 客户端缓存SharedObject
读取缓存: usernameSO = SharedObject.getLocal('username'); if (usernameSO) { usernameSOAL = usernameSO.da ...