现在看到最小生成树 并查集水题
二话不说 10分钟AC 真的舒服。
这题把最小生成树构建出来 构建的时候取个最大边就行了
/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
struct Edge{
int u,v,cost;
};
Edge edge[10005];
int par[2005];
int rank[2005];
int n,m;
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]<rank[y])
par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
bool cmp(const Edge &a,const Edge &b)
{
return a.cost<b.cost;
}
int kruskal()
{
init(n);
sort(edge+1,edge+1+m,cmp);
int ans=0;
for(int i=1;i<=m;i++)
{
if(same(edge[i].u,edge[i].v)==false)
{
unite(edge[i].u,edge[i].v);
ans=max(ans,edge[i].cost);
}
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>edge[i].u>>edge[i].v>>edge[i].cost;
cout<<kruskal()<<endl;
return 0;
}