mengxiaolong

 

SP368 CSTREET - Cobbled streets 题解

题意

选 n−1 条道路连接 n 个城市,且使得其修建的价格最小。

分析

最小生成树的模板题,可以用 kruskal 来做。

首先,先将所有的边权从小到大排序。

然后,取当前没有选过的,且边权最小的边,判断它连接的两个点是否同属一个集合,如果不是就把他们加到同一个集合中,再记录答案。

代码很简单,也很容易理解。

struct node{
    int from,to,w;
}e[N*N/2];
void init(){
    for(int i=1;i<=n;i++)f[i]=i;
}
int find(int x){
    if(x==f[x])return x;
    return f[x]=find(f[x]);
}
void un(int x,int y){
    int fx=find(x);
    int fy=find(y);
    if(fx==fy)return ;
    else f[fx]=fy; 
}
bool cmp(node x,node y){
    return x.w<y.w;
}
int kruskal(){
    sort(e+1,e+m+1,cmp);
    int sum=0,cnt=0;//sum权值之和,cnt加入边数
    for(int i=1;i<=m;i++){
        if(find(e[i].from)!=find(e[i].to)){
            un(e[i].from,e[i].to);
            sum+=e[i].w*p;
            cnt++;
            if(cnt==n-1)return sum;
        }
    } 
    return -1;
}

posted on 2024-08-21 20:37  zsfzmxl  阅读(30)  评论(0)    收藏  举报

导航