题解 | #畅通工程#

畅通工程

https://www.nowcoder.com/practice/23c9fe571c1346bb91fdffea8a0b195f

#include <iostream>
#include <algorithm>
using namespace std;

const int N=100;
int father[N];
int height[N];

struct edge{
    int from;
    int to;
    int cost;
}edges[1000];

void initial(int n){
    for(int i=1;i<=n;i++){
        father[i]=i;
        height[i]=0;
    }
}

int find(int x){
    if(father[x]!=x)  father[x]=find(father[x]);
    return father[x];
}

void Union(int a,int b){
    a=find(a);
    b=find(b);
    if(a!=b){
        if(height[a]<height[b]) father[a]=b;
        else if(height[a]>height[b]) father[b]=a;
        else{
            father[a]=b;
            height[b]++;
        }
    }
}

bool comp(edge a,edge b){
    return a.cost<b.cost;
}

int Kruscal(int n,int num){//n个点num条边
    initial(n);//对节点初始化
    int sum=0;
    sort(edges+1,edges+num+1,comp);
    for(int i=1;i<=num;i++){
        edge current = edges[i];
        if(find(current.from)!=find(current.to)) 
        {
            Union(current.from, current.to);
            sum+=current.cost;
        }
    }
    return sum;
}

int main() {
    int n,m;
    while(cin>>n>>m){//n条边m个村
        if(n==0) break;
        for(int i=1;i<=n;i++){
            cin>>edges[i].from>>edges[i].to>>edges[i].cost;
        }
        int answer=Kruscal(m,n);
        int a=0;//计算是否单连通
        for(int i=1;i<=n;i++){
            if(find(i)==i) a++;
        }
        if(a==1&&n>=m-1)
            cout<<answer<<endl;
        else
            cout<<'?'<<endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务