一、题目描述
二、思路概述
1.这个问题实质上可以理解为求最小生成树的最大边长,但是理解的过程非常的麻烦。
三、细节
1.此题很容易超时,所以要尽量降低时间复杂度,例如压缩并查集,选择标准输入输出。
四、完整代码
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=2e5+10;//?
struct edge
{
int u,v,w;
}g[maxn]; //把边都放入一个数组中,因为不需要遍历,所以数组比较方便
int cmp(edge x,edge y)
{
if(x.w!=y.w)return x.w<y.w;//先按b升序
// return x.a>y.a;//再按a降序
}
int pri[60000];
int find(int x)
{
return (x==pri[x])?x:pri[x]=find(pri[x]);//并查集记得压缩一下
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
//cin>>n>>m;
int root;
scanf("%d",&root);
//cin>>root;
int k=-1;
//int wi;
int uu,vv,ww;
for(int i=0;i<m;i++)//m行是哪个点和哪个店直接长度
{
scanf("%d%d%d",&uu,&vv,&ww);
//cin>>uu>>vv>>ww;
k++;
g[k].u=uu;
g[k].v=vv;
g[k].w=ww;
} //g[0]-g[k]都是点
//int *pri=new int[n+1];
//并查集,记录此点是否应该放入结果中
for(int i=0;i<=n;i++)
pri[i]=i;
sort(g,g+k+1,cmp) ;//按w升序排序
int maxp=0;
//int maxb=n+1;
for(int i=0;i<=k;i++)
{
int eu=find(g[i].u);
int ev=find(g[i].v);
if(find(eu)!=find(ev))
{
maxp=max(maxp,g[i].w);
pri[ev]=eu;
}
}
cout<<maxp<<endl;
}