51nod 1640 天气晴朗的魔法
2017-08-14 16:31
429 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640
思路:先求最小生成树,最小生成树的最大值肯定是最小的,然后再求一次最大生成树(所有大于最小生成树的最大值的边抛弃)
思路:先求最小生成树,最小生成树的最大值肯定是最小的,然后再求一次最大生成树(所有大于最小生成树的最大值的边抛弃)
#include<iostream> #include<algorithm> #include<stdio.h> #define maxn 100005 using namespace std; struct node { int s,e,cost; }; node no[maxn*2]; int fat[maxn]; int find(int x) { return fat[x]==x?x:fat[x]=find(fat[x]); } bool cmp(node a,node b) { return a.cost<b.cost; } int main() { int n,m; scanf("%d%d",&n,&m); for(int x=0;x<m;x++) scanf("%d%d%d",&no[x].s,&no[x].e,&no[x].cost); for(int x=0;x<=n;x++) fat[x]=x; sort(no,no+m,cmp); int max=0,ans=0; for(int x=0;x<m;x++) { int x1=find(no[x].s); int y1=find(no[x].e); if(x1!=y1) { fat[x1]=y1,ans++; if(no[x].cost>max) max=no[x].cost; } if(ans==n-1) break; } ans=0; long long result=0; for(int x=0;x<=n;x++) fat[x]=x; for(int x=m-1;x>=0;x--) { if(no[x].cost>max) continue; int x1=find(no[x].s); int y1=find(no[x].e); if(x1!=y1) fat[x1]=y1,ans++,result+=no[x].cost; if(ans==n-1) break; } printf("%lld\n",result); }
相关文章推荐
- 51Nod - 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了
- 51nod-1640--天气晴朗的魔法(简单最小生成树)
- 51nod 1640 天气晴朗的魔法
- 51NOD 1640 天气晴朗的魔法 最小生成树 kuskal
- 51nod 1640 天气晴朗的魔法 By Assassin
- 51nod 1640天气晴朗的魔法(克鲁斯卡尔,并查集)
- 51nod 1640 天气晴朗的魔法 prime队列+最小生成树+最大生成树+邻接表
- 51nod 1640 天气晴朗的魔法(并查集)
- 51nod 1640 天气晴朗的魔法【最小生成树概念】
- 51nod 1640 天气晴朗的魔法 最小生成树
- 51nod 1640 天气晴朗的魔法【二分+最大生成树】
- 51nod 1640 天气晴朗的魔法 克鲁斯卡尔
- 51nod 1640 天气晴朗的魔法 最小生成树
- 51Nod-1640-天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法(最小生成树)
- 51nod 1640 天气晴朗的魔法(kruskal)
- 51nod 1640 天气晴朗的魔法 【二分枚举最大生成树】or【最小&&最大 生成树】
- 51nod 1640 天气晴朗的魔法
- 51nod 1640 天气晴朗的魔法