题目链接 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640

【题目描述】
这样阴沉的天气持续下去,我们不免担心起他的健康。

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,表示符合条件的魔法阵的魔力值之和。

Sample Input
4 6
1 2 3
1 3 1
1 4 7
2 3 4
2 4 5
3 4 6
Sample Output
12

【思路】
首先题目中的两个要求是有先后顺序的,优先满足魔力值最大的边最小,然后在这个前提之下满足所有边的魔力总和最大。要使得最大边权最小只需要求出最小生成树,最小生成树上面边权最大的那条边就是最大边权,然后只用所有边权小于等于这个最大边权的边再做一次最大生成树就是答案了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn=100005;struct Edge{int from,to;ll dist;Edge(int f,int t,ll d):from(f),to(t),dist(d){}bool operator<(const Edge& e)const{return dist<e.dist;}
};int n,m,pos;
int par[maxn];
vector<Edge> edges;int find(int x){ return x==par[x]?x:par[x]=find(par[x]); }void kruscal(){sort(edges.begin(),edges.end());for(int i=0;i<=n;++i) par[i]=i;int cnt=0;for(int i=0;i<m;++i){Edge& e=edges[i];int x=find(e.from);int y=find(e.to);if(x!=y){par[x]=y;if(++cnt==n-1){pos=i;while(pos+1<edges.size() && edges[pos+1].dist==edges[pos].dist) ++pos;break;}}}
}void solve(){ll ans=0;for(int i=0;i<=n;++i) par[i]=i;int cnt=0;for(int i=pos;i>=0;--i){Edge& e=edges[i];int x=find(e.from);int y=find(e.to);if(x!=y){par[x]=y;ans+=e.dist;if(++cnt==n-1) break;}}printf("%lld\n",ans);
}int main(){scanf("%d%d",&n,&m);for(int i=0;i<m;++i){int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);edges.push_back(Edge(u,v,w));}kruscal();solve();return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465181.html

51Nod 1640 - 天气晴朗的魔法(最小生成树变形)相关推荐

  1. 【图论训练】天气晴朗的魔法【最小生成树】

    思路: 因为是最大值要最小,所以直接先跑一遍最小生成树,然后跑出最大的那条边. 然后让总和最大,直接从那条边往前跑,跑最大的. c o d e code code #include<iostre ...

  2. 51nod-1640--天气晴朗的魔法(简单最小生成树)

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

  3. nod-1640-天气晴朗的魔法

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

  4. 51Nod-1640-天气晴朗的魔法(最小生成树)

    转载于:https://www.cnblogs.com/GrowingJlx/p/6642734.html

  5. hdu 1598(最小生成树变形)

    解题思路:这道题我一开始的思路是动规,dp_max[i][j]表示i-j的最大边,dp_min[i][j]表示i-j的最小边,可是这样会有问题,有可能最大边与最小边不在同一条路径上,这样就很麻烦了. ...

  6. codeforces 962E Byteland, Berland and Disputed Cities 最小生成树变形

    题目 题目链接 题意 在OxOxOx轴上有一堆点,这些点有三种类型R.B.PR.B.PR.B.P型,现在要求添加一些线段把这些点连起来,使得如果去掉RRR类型点,剩下的点都是联通的.如果去掉B&quo ...

  7. 【HDU - 5922】Minimum’s Revenge(思维,最小生成树变形)

    题干: There is a graph of n vertices which are indexed from 1 to n. For any pair of different vertices ...

  8. 【HDU - 4786 】Fibonacci Tree (最小生成树变形,上下界贪心,tricks)

    题干: Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on ...

  9. 【2018ACM山东省赛 - C】Cities(最小生成树变形优化,贪心思维)

    题干: Problem Description There are nnn cities in Byteland, and the ithi_{th}ith​ city has a value aia ...

最新文章

  1. Linux下使用diff和patch制作及打补丁(已经实践可行!)
  2. 在Win 8.1上安装配置FlashDevelop5.0.0
  3. POJ 3258:River Hopscotch (最大化最小值)
  4. Windows如何 cmd 查找文件路径 开机启动 CMD语音播放 CMD切换到管理员!
  5. eclipse一直卡住,出现 “android sdk content loader 0%” 卡住的错误分析及解决方法...
  6. 【技术综述】万字长文详解Faster RCNN源代码
  7. 10款炫酷的HTML5动画特效
  8. 用 Python 写一个 Kaggle 比赛排行榜的爬虫
  9. java打印空心金字塔
  10. c语言综合性程序设计,《C语言程序设计》综合性实验报告撰写格式
  11. 支付宝APP支付里设置应用网关和授权回调地址是不必填的
  12. nxlog管理配置linux,如何使用NXLOG管理配置WindowsServer日志.PDF
  13. MFC之映美精双目相机保存图片
  14. Spark学习:Win10中编译Spark源码
  15. jpg、png、jpeg区别与压缩等知识总结 —— 性能优化篇
  16. À¸´£º¹²ÏíÖйúÐÅÏ¢²úÒµ´øÀ´µÄÓ°ÏìÁ¦
  17. JAVA 消息队列的使用场景
  18. 黄褐斑激光-百花净斑方
  19. 一级计算机浏览器题加收藏夹,2016年计算机一级考试上机操作重难点突破
  20. el-upload上传文件

热门文章

  1. golang map的定义语法
  2. 【网址收藏】安装VMware Tools显示灰色正确解决办法
  3. RabbitMQ RPC远程调用模式
  4. Lucene实现全文检索的流程
  5. SpringData Jpa、Hibernate、Jpa 三者之间的关系
  6. Qt+VS2013编译报错:'cl' 不是内部或外部命令,也不是可运行的程序
  7. 多项式(polynomial)和 单项式(monomial)
  8. 使用循环链表解决约瑟夫环问题
  9. linux父子进程同步实验,Linux-父子进程的简单同步
  10. gson生成jsonobject_GSON形式生成和解析json数据