51nod-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
分析:
其实这个题目读懂题目后很好做,求的是在最大值最小的前提下,魔法值之和最大的生成树
其实就是先求出最小生成树之后,记录一下生成树中的最大值,然后求边权最大值为这个值的最大生成树
注意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
View Code
转载于:https://www.cnblogs.com/liuzhanshan/p/6736241.html
51nod-1640--天气晴朗的魔法(简单最小生成树)相关推荐
- 51Nod 1640 - 天气晴朗的魔法(最小生成树变形)
题目链接 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 [题目描述] 这样阴沉的天气持续下去,我们不免担心起他的 ...
- 【图论训练】天气晴朗的魔法【最小生成树】
思路: 因为是最大值要最小,所以直接先跑一遍最小生成树,然后跑出最大的那条边. 然后让总和最大,直接从那条边往前跑,跑最大的. c o d e code code #include<iostre ...
- 51Nod-1640-天气晴朗的魔法(最小生成树)
转载于:https://www.cnblogs.com/GrowingJlx/p/6642734.html
- nod-1640-天气晴朗的魔法
题目: 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日开展了主题为"天气晴朗"的魔法交流活动. N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法 ...
- [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)
L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...
- 51Nod - 1640
开始想着二分最大值,然而调了调怎么都不对QAQ-. 然后看了一下解答: 最小生成树确定最小的边究竟是多少,因为你要求最大边最小嘛-那这样肯定能求出最小值,但这样结果未必最优-.所以,我们再倒着去加入并 ...
- 51nod 1021 石子归并 (动态规划 简单代码)
题目: 思路:动态规划,递推式子 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); dp[i][j]表示合并第i ...
- 【每日SQL打卡】DAY 24丨不同国家的天气类型【难度简单】
[未来的你,会感谢今天努力的你]每日两题,一难一易,每天进步一点点,可能会直接导致一场面试的成功,或工作的轻松搞定,从而升职加薪迎娶白富美,加油小伙伴!
- 我的世界服务器如何修改天气,我的世界怎么切换天气 原来这么简单
我的世界怎么切换天气?原来这么简单.在我的世界中,天气系统也是相当真实的,不但有正常的晴天,还有多云.下雨天.下雪天等等.但是在夜晚的时候,有些天气非常影响玩家的视野,并且下雨.下雪的时候,游戏也比较 ...
最新文章
- python发邮件包含表格,在Python中在电子邮件正文中包含Excel表
- Ktor 1.0发布:JetBrains推出的Kotlin Web框架
- Word组件 Spire.Doc for .NET V6.0.3发布 | 修复多个重大bug
- 八皇后问题python实现_八皇后问题的python实现
- Oracle 数据库启动 startup和startup force的区别
- C++之手写strlen函数
- uni app 调用网络打印机_uni-app 的使用体验总结
- ++ 多核cpu 并行_一文读懂什么是多核并行计算(三)
- HDU2191 多重背包或者01背包 xingxing在努力
- 发布一个域安全级别的无代码InfoPath表单作为文档库模版 (InfoPath 一)
- 7.15 HTMl + CSS 笔记整理(一)
- STM32 USB主机通信连接中断过程
- 如何读取csv文件并将其转化为tsv文件
- 计算机网络研究进展,计算机网络信息空间(Cyberspace)的人文地理学的研究进展和展望.pdf...
- 密码学 BugKu 这不是摩斯密码
- 【HBase】HBase数据库基本操作(Shell)
- 编译原理—实验二LL(1)语法分析(一)
- 5G风口短信“变脸”求生,三大运营商要联手战微信?
- 百度真的出了瑞丽算法吗
- Cordova各种事件