本题是要求最小生成树中的最大长度, 无向边,初始化es结构体时要加倍,别忘了init(n)并查集的初始化,同时要单独标记使用过的边数,
判断ans==n-1时,即找到了最大边。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #include <vector> #include <map> #include <set> #include <string> #include <cmath> using namespace std; const int INF=0x3f3f3f3f; typedef long long ll; int par[2005]; int ran[2005]; struct edge{ int from,to,cost; }; edge es[20005]; bool cmp(const edge& x,const edge& y){ return x.cost<y.cost; } void init(int n){ for(int i=0;i<n;i++){ par[i]=i; ran[i]=0; } } int find(int x){ if(par[x]==x) return x; return par[x]=find(par[x]); } void unite(int x,int y){ x=find(x); y=find(y); if(x==y) return ; if(ran[x]<ran[y]) par[x]=y; else{ par[y]=x; if(ran[x]==ran[y]) ran[x]++; } } bool same(int x,int y){ return find(x)==find(y); } int main() { int n,m,k,res; scanf("%d%d",&n,&m); int a,b,c; k=0; while(m--){ scanf("%d%d%d",&a,&b,&c); a--;b--; es[k].from=a; es[k].to=b; es[k++].cost=c; es[k].from=b; es[k].to=a; es[k++].cost=c; } sort(es,es+k,cmp); init(n);//注意并查集的初始化 int ans=0; for(int i=0;i<k;i++){ edge e=es[i]; if(!same(e.to,e.from)){ unite(e.to,e.from); ans++;//单独标记已用过的边数 if(ans==n-1){ res=e.cost; break; } } } printf("%d\n",res); return 0; }