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
 
 

分析:

其实这个题目读懂题目后很好做,求的是在最大值最小的前提下,魔法值之和最大的生成树

其实就是先求出最小生成树之后,记录一下生成树中的最大值,然后求边权最大值为这个值的最大生成树

注意51行到53行,一定要进行这一步处理,不然会WA。。。。

代码:

  1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MAXN=100000+30;
4 const int MAXM=2*MAXN+30;
5 int f[MAXN];
6 struct edge
7 {
8 int u,v;
9 long long w;
10 }e[MAXM];
11 int tot;
12 void addedge(int v,int u,int w)
13 {
14 e[tot].v=v;
15 e[tot].u=u;
16 e[tot].w=w;
17 tot++;
18 }
19 int fin(int x)
20 {
21 if(f[x]==-1)
22 return x;
23 else{
24 f[x]=fin(f[x]);
25 return f[x];
26 }
27 }
28 bool cmp(edge a,edge b)
29 {
30 return a.w<b.w;
31 }
32 long long kru(int n)
33 {
34 memset(f,-1,sizeof(f));
35 sort(e,e+tot,cmp);
36 long long num=0,ans=0;
37 int u,v,w;
38 int i;
39 for(i=0;i<tot;i++){
40 u=e[i].u,v=e[i].v,w=e[i].w;
41 int t1=fin(u);
42 int t2=fin(v);
43 if(t1!=t2){
44 num++;
45 f[t2]=t1;
46 }
47 if(num==n-1) break;
48 }
49 num=0;
50 memset(f,-1,sizeof(f));
51 while(e[i].w==e[i+1].w){
52 i++;
53 }
54 for(;i>=0;i--){
55 u=e[i].u,v=e[i].v,w=e[i].w;
56 int t1=fin(u);
57 int t2=fin(v);
58 if(t1!=t2){
59 num++;
60 ans+=w;
61 f[t2]=t1;
62 }
63 if(num==n-1) break;
64 }
65 if(num<n-1) return -1;
66 else return ans;
67 }
68 int main()
69 {
70 //freopen("data.in","r",stdin);
71 int n,m;
72 int a,b;
73 long long v;
74 tot=0;
75 scanf("%d%d",&n,&m);
76 for(int i=0;i<m;i++){
77 scanf("%d%d%lld",&a,&b,&v);
78 addedge(a,b,v);
79 }
80 //printf("%lld\n",kru(n));
81 cout<<kru(n)<<endl;
82 }
83

51nod-1640--天气晴朗的魔法(简单最小生成树)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 51nod 天气晴朗的魔法 - (Kruskall最小生成树)

    题目: 基准时间限制:1 秒 空间限制:131072 KB  51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...

  7. 51 Nod 1640 天气晴朗的魔法( Kruskall )

    #include <bits/stdc++.h> typedef long long LL; using namespace std; ; struct node{ LL u,v,w; n ...

  8. 51nod 1640 MST+二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 ...

  9. hdu1102 Constructing Roads (简单最小生成树Prim算法)

    Problem Description There are N villages, which are numbered from 1 to N, and you should build some ...

随机推荐

  1. 第一次编译ffmpeg

    今天开始玩ffmpeg了. 从官网下载来的压缩包,不会编译诶,于是我开始研究起来了. 下面就是实时记录的随笔: 首先是从官网下载来的ffmpeg,就是下面这个版本,目前的最新版吧. http://ff ...

  2. CentOS7 安装ffmpeg

    安装EPEL Release,因为安装需要使用其他的repo源,所以需要EPEL支持:yum install -y epel-release#如果出现缺少Code提示,可以: sudo rpm --i ...

  3. 删除链表中重复的结点——牛客剑指offer

    题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...

  4. Angular获取dom元素,以及父子组建之间相互传值

    1.使用原生js代码获取dom元素 在ts文件中有一个ngOnInit()的方法,这个方式是指在模块加载完毕之后并不是dom加载完毕,也就是说如果你的dom元素中使用的angular的指令,然后想在这 ...

  5. [转载]汇编语言assume伪指令的作用

    原文:https://blog.csdn.net/u010234808/article/details/38366943 摘出关键部分: 编写程序,是写给编译软件的.由编译软件,编译成机器码,再去控制 ...

  6. 语句:if语句、do-while语句、while语句、for语句、for-in语句、with语句、label语句、switch语句以及break和continue语句;

    ECMA-262规定了一组语句(也成为流控制语句),语句定义了ECMASript中的主要语法. 语句分类:条件分支语句.条件判断语句和循环语句 代码块:是一对包裹多行代码的花括号,代码块后不可加引号: ...

  7. jQuery 遍历 - 祖先

    通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() pare ...

  8. centos 7 安装 redis-5.0.5

    [root@localhost ~]# yum -y install gcc make [root@localhost ~]# wget http://download.redis.io/releas ...

  9. numpy中与金融有关的函数

    fv函数 计算未来的价值 def fv(rate, nper, pmt, pv, when='end'): ... 参数: rate:存款/贷款每期的利率 nper:存款/贷款期数 pmt:存款/贷款 ...

  10. centos7搭建ntp时间同步服务器chrony服务

    centos7搭建ntp时间同步服务器chrony服务 前言: 在centos6的时候我们基本使用的是ntp服务用来做时间同步,但是在centos7后推荐是chrony作为时间同步器的服务端使用, ...