题目:数据中心
题意:
输入:
输出:
解题思路:看似很复杂,其实就是在构成树的前提下求所有边中的最大边,并且使其最小就行了;最小最大问题一般可以用二分求解,但这个题还有个妙招,就是利用最小生成树的思想,把边求和变成求最大值;这样,最大的边一定是最小的。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int u,v,w;
}edge[200005];
int parent[50005]={0},n,m,root;
int find(int x)
{
return (x==parent[x])?x:parent[x]=find(parent[x]);//并查集记得压缩一下
}
bool cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
scanf("%d%d%d",&n,&m,&root);
int k=0;
for(int i=1;i<=m;i++)
{
int x;
int u,v,s;
scanf("%d%d%d",&u,&v,&s);
edge[++k].u=u;
edge[k].v=v;
edge[k].w=s;
}
for(int i=1;i<=n+5;i++)
{
parent[i]=i;
}
sort(edge+1,edge+m+1,cmp);
long long sum=0;
for(int i=1;i<=m;i++)
{
int eu=find(edge[i].u);
int ev=find(edge[i].v);
if(find(eu)==find(ev))
{
continue;
}
sum=(sum>edge[i].w)?sum:edge[i].w;//求个最大值
parent[ev]=eu;
}
printf("%d\n",sum);
}