您的位置:首页 > 其它

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: