本意是求最小瓶颈生成树,但是我们可以证明:最小生成树也是最小瓶颈生成树(其实我不会)。数据范围很小,暴力kruscal即可。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 struct Edge{int u,v,w;void Read(){scanf("%d%d%d",&u,&v,&w);}}edges[10001]; 5 bool operator < (const Edge &a,const Edge &b){return a.w<b.w;} 6 int n,m,fa[301],rank[301],tot; 7 void init(){for(int i=1;i<=n;i++)fa[i]=i;} 8 int findroot(int x) 9 { 10 if(x==fa[x]) return x; 11 int rt=findroot(fa[x]); 12 fa[x]=rt; 13 return rt; 14 } 15 void Union(const int &U,const int &V) 16 { 17 if(rank[V]<rank[U]) fa[V]=U; 18 else 19 { 20 fa[U]=V; 21 if(rank[U]==rank[V]) ++rank[U]; 22 } 23 } 24 int main() 25 { 26 scanf("%d%d",&n,&m); init(); 27 for(int i=1;i<=m;++i) edges[i].Read(); 28 sort(edges+1,edges+m+1); 29 for(int i=1;i<=m;i++) 30 { 31 int f1=findroot(edges[i].u),f2=findroot(edges[i].v); 32 if(f1!=f2) 33 { 34 Union(f1,f2); 35 tot++; 36 if(tot==n-1) 37 { 38 printf("%d %d\n",n-1,edges[i].w); 39 return 0; 40 } 41 } 42 } 43 return 0; 44 }
时间: 2024-10-17 01:40:36