题解 | 还是畅通工程(kruskal)

还是畅通工程

https://www.nowcoder.com/practice/d6bd75dbb36e410995f8673a6a2e2229

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

const int MAX=100;

struct edge{
    int from;
    int to;
    int length;
};

edge s[MAX*MAX];
int father[MAX];
int height[MAX];

void init(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[b]=a;
        }
        else if(height[a]<height[b])
        {
            father[a]=b;
        }
        else{
            father[b]=a;
            height[a]++;
        }
    }
    return;
}

bool compare(edge a, edge b)
{
    return a.length<b.length;
}

int kruskal(int edgenum)
{
    int answer=0;
    sort(s,s+edgenum,compare);
    for(int i=0; i<edgenum; i++)
    {
        if(find(s[i].from)!=find(s[i].to))
        {
            Union(s[i].from,s[i].to);
            answer+=s[i].length;
        }
    }
    return answer;
}

int main() {
    int n;
    while (cin >> n) {
        if(n==0)
        {
            break;
        }
        int edgenum=n*(n-1)/2;
        init(n);
        for(int i=0; i<edgenum; i++)
        {
            cin >> s[i].from >> s[i].to >> s[i].length;
        }
        int answer=0;
        cout << kruskal(edgenum) << endl;
    }
    return 0;
}

全部评论

相关推荐

06-20 14:27
中山大学 C++
rt,day3就开始接需求
星际探神:你就想 你是水货他们都没面出来 他们也水 管他呢
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务