题意:
sample input:
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
sample output:
4
note:思路:
求解最小生成树中耗时最大的边的值。与C题的思路大致相同,将边的值进行排序,将最小边的值进行记录,之后通过对边的值从小到大的顺序进行判断,如果新加入的边会与其他边形成环,则摈弃,继续对其他边进行判断,最终形成最小生成树,在形成最小生成树的过程中,加入的边的值与之前加入的边的最大值进行比较,更新新的最大值,并在最后将其进行输出。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int par[100050];
struct node{
int begin;
int end;
int value;
bool operator<(const node &te) const{
return value < te.value;
}
}temp[100050];
void init(int n) {
for (int i = 1; i <= n + 1; i++)
par[i] = i;
}
int find(int x)
{
if(par[x]==x)
{
return x;
}
return par[x]=find(par[x]);
}
bool unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
par[x]=y;
return true;
//sum[y]=sum[y]+sum[x];
}
return false;
}
int main()
{
int n,m,root;
int begin,end,value;
int cm=0;
int num=0;
int ans;
cin>>n>>m>>root;
for(int i=0;i<m;i++)
{
cin>>begin>>end>>value;
temp[cm].begin=begin;
temp[cm].end=end;
temp[cm].value=value;
cm++;
}
init(n);
sort(temp,temp+cm);
for(int i=0;i<cm;i++)
{
if(unite(temp[i].begin,temp[i].end))
{
ans=max(ans,temp[i].value);
num++;
}
if(num==n)
{
break;
}
}
cout<<ans;
return 0;
}