51nod1640mst+二分

zzq zzq     2022-09-14     467

关键词:

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了。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 struct Edge
 5 {
 6     int u,v,w;
 7     bool operator<(const Edge &t)const{
 8     return w<t.w;
 9     }
10 }e[200005];
11 int f[100005];
12 int getf(int v){return f[v]==v?f[v]:f[v]=getf(f[v]);}
13 bool ok(int k,int N,int M)
14 {
15     for(int i=1;i<=N;++i) f[i]=i;
16     for(int i=0;i<M&&e[i].w<=k;i++){
17         int fu=getf(e[i].u),fv=getf(e[i].v);
18         if(fv!=fu){
19             N--;
20             f[fv]=fu;
21         }
22         if(N==1) return 1;
23     }
24     return 0;
25 }
26 int main()
27 {
28     int N,M,i,j,l=2147483647,r=0;
29     cin>>N>>M;
30     for(i=0;i<M;++i){
31         scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
32         l=min(l,e[i].w);
33         r=max(r,e[i].w);
34     }
35     sort(e,e+M);
36     LL ans=0;
37     while(l<r){
38         int mid=l+((r-l)>>1);
39         if(ok(mid,N,M)){
40            r=mid;
41         }
42         else{
43           l=mid+1;
44         }
45     }
46     for(int i=1;i<=N;++i) f[i]=i;
47     Edge e1{-1,-1,l};
48     int ed=upper_bound(e,e+M+1,e1)-e;
49     for(int i=ed;i>=0;--i){
50         if(e[i].w>l) continue;
51         int fu=getf(e[i].u),fv=getf(e[i].v);
52         if(fv!=fu){
53             ans+=e[i].w;
54             N--;
55             f[fv]=fu;
56         }
57         if(N==1) break;
58     }
59     printf("%lld
",ans);
60     return 0;
61 }

 

51nod1640天气晴朗的魔法(最小生成树)(代码片段)

题目链接解题思路??看这题第一眼就想到了二分,虽然也过了不过还有一个更好的解法。本题的核心就是如何找到那条可以最小的最大的边(S),二分确实是一个办法,但是还有一种办法是求最小生成树,其最大边就是(S)。??因为... 查看详情

51nod1640(kruscal)

...目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 题意:中文题诶~ 思路:kruscal题目要求是在边权最大值最小的情况下总权值尽量大,注意其中的优先级;可以先从小到大加边kruscal一遍得到最小的最大边权,... 查看详情

51nod1640天气晴朗的魔法

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

51nod1640天气晴朗的魔法(最小生成树)

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

51nod1601完全图mst计数

我们可以根据二进位划分集合,从高到底,越来越首先,最高位不同的点集合中,必须存在一条边,所以,可以用trie树来处理该操作并统计该边的数目。然后对于两个不同的集合,递归重复这样的操作,就会得到两个集合的MST... 查看详情

51nod1105(二分)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 题意:中文题诶~ 思路:直接二分答案,再通过二分找有多少组合大于等于当前值,确定答案; 代码:1#include<iostream>2#include<stdio.h>3#include<algo 查看详情

51nod1267二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=126712674个数和为0基准时间限制:1秒空间限制:131072KB分值:20难度:3级算法题收藏关注给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"... 查看详情

51nod1128二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=11281128正整数分组 V2基准时间限制:1秒空间限制:131072KB分值:80难度:5级算法题收藏关注给出一个长度为N的正整数数组,不改变数组元素的顺序,将这N个数分为K组。各组中元... 查看详情

51nod1279(二分)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 题意:中文题诶~ 思路:就想短板效应一样,很显然决定当前盘子能否到达高度x位置的是井口到x位置的最窄地方能否放下盘子,那么我们可以用vis[i]存储井... 查看详情

51nod1243排船的问题(二分)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243题意: 思路:二分来做,每次贪心的把船安排到能安排的最左边即可。1#include<iostream>2#include<algorithm>3#include<cstring>4#include<cstdio> 查看详情

51nod1287(二分线段树)

...ttps://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287思路:二分查找大于等于b[i]的最前面的位置(想起一次错漏百出的网赛中一道没在比赛A掉的题),并更新线段树,总复杂度nlogn。我并不是停留在舒适区,而是找回当年因为死... 查看详情

51nod1243二分+贪心

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=12431243排船的问题题目来源:Codility基准时间限制:1秒空间限制:131072KB分值:40难度:4级算法题收藏关注一个码头中有N艘船和N个木桩,船的长度为2*X,码头的宽度为M,N个木桩的位... 查看详情

51nod1010(枚举+二分)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 题意:中文题诶~ 思路:求第一个比x(1<=x<=1e18)大或者等于的数y,且y的因子只有2,3,5,即y=pow(2,i)*pow(3,j)*pow(5,k);那么显然我们可以通过枚举i,j,k求出所有由2... 查看详情

51nod125701分数规划/二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=12571257背包问题 V3基准时间限制:3秒空间限制:131072KB分值:80难度:5级算法题收藏关注N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),... 查看详情

51nod1105二分好题

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=11051105第K大的数基准时间限制:1秒空间限制:131072KB分值:40难度:4级算法题收藏关注数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0]*B[0],A[0]*B[1]......A[1]*B[0],A[1]*B[1]... 查看详情

51nod10903个数和为0(排序+二分)

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 首先将序列进行排序,然后根据a+b+c=0,c=-a-b,二分查找c,注意判重,即c>b。时间复杂度O(n*n*logn)。#include<bits/stdc++.h>usingnamespacestd;intn,a[1005];in 查看详情

51nod2006飞行员配对(二分图最大匹配)

链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=2006思路:二分匹配注意nm的关系代码:1#include<iostream>2#include<string.h>3usingnamespacestd;4intg[105][105],vis[105],who[105];5intn,m;6bo 查看详情

51nod1010stl/数论/二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=10101010只包含因子235基准时间限制:1秒空间限制:131072KB分值:10难度:2级算法题收藏关注K的因子中只包含235。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。所有这样的K组成了一个序... 查看详情