P2330 [SCOI2005] 繁忙的都市

原题链接

法一:运用结论  最小生成树也是最小瓶颈树,但最小瓶颈树不一定是最小生成树。

所以这题我们可以直接套用最小生成树模板

#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是否正确。

posted @ 2024-03-04 19:44  黑屿白  阅读(25)  评论(0)    收藏  举报