法一:运用结论 最小生成树也是最小瓶颈树,但最小瓶颈树不一定是最小生成树。
所以这题我们可以直接套用最小生成树模板
#include<bits/stdc++.h> using namespace std; struct G{ int from,to,value; }; G a[8005]; int father[305],n,m; void build(){ for (int i=1;i<=n;i++) father[i]=i; } int find(int x){ if (father[x]!=x) father[x]=find(father[x]); return father[x]; } void Union(int x,int y){ father[x]=y; } bool cmp(G a,G b){ return a.value<b.value; } int main(){ int ans; cin>>n>>m; build(); for (int i=1;i<=m;i++){ cin>>a[i].from>>a[i].to>>a[i].value; } sort(a+1,a+m+1,cmp); for (int i=1;i<=m;i++){ int fx=find(a[i].from),fy=find(a[i].to); if (fx!=fy){ Union(fx,fy); ans=a[i].value; } } printf("%d %d\n",n-1,ans); return 0; }
法二:二分答案+并查集
因为分值具有单调性,所以我们可以通过二分去寻求答案ans,接下来对于ans我们可以把所有<=ans的边留下来看所有路口是否在一个集合中来判断ans是否正确。
标签:int,ans,最小,P2330,build,都市,SCOI2005 From: https://www.cnblogs.com/purple123/p/18052504