洛谷 P2330 [SCOI2005]繁忙的都市 最小生成树

洛谷 P2330 [SCOI2005]繁忙的都市 最小生成树

题解:

题目共有三个条件:

1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。
2.在满足要求1的情况下,改造的道路尽量少。
3.在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。
其实第三个条件就是最小生成树的性质。

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<map>
#define MAX 305
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int n,m;
int fa[MAX];

int findfather(int x){
    if(x!=fa[x]){
        return fa[x]=findfather(fa[x]);
    }
    return fa[x];
}

struct edge{
    int a,b,len;
}e[100005];

bool cmp(edge a,edge b){
    return a.len<b.len;
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
    int a,b,len;
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&len);
        e[i].a=a,e[i].b=b,e[i].len=len;
    }
    sort(e,e+m,cmp);
    int maxl=-1;
    for(int i=0;i<m;i++){
        if(findfather(e[i].a)!=findfather(e[i].b)){
            fa[findfather(e[i].a)]=findfather(e[i].b);
            maxl=max(maxl,e[i].len);
        }
    }
    printf("%d %d",n-1,maxl);
    return 0;
}

发布了253 篇原创文章 · 获赞 15 · 访问量 7962

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/104057463