题解 | #找出直系亲属#

还是畅通工程

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

kruskal解决最小生成树问题

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

//例题11.4
const int maxn=110;
int father[maxn];
int height[maxn];

//初始化
void initial(){
    for(int i=0;i<=maxn;i++){
        father[i]=-1;
        height[i]=0;
    }
}

//Find

int Find(int x){
    if (father[x]==-1)return x;
    return Find(father[x]);
}
//union
void Union(int x,int y){
    int fx=Find(x);
    int fy=Find(y);
    if (fx==fy)return;
    if(height[fx]>height[fy]){
        father[fy]=fx;
    }
    else if(height[fx]<height[fy]){
        father[fx]=fy;
    }
    else{
        father[fx]=fy;
        height[fy]++;
    }
}

struct edge{
    int node1;
    int node2;
    int dist;
};

edge graph[maxn*maxn];

int compare(edge x,edge y){
    return x.dist<y.dist;
}

int kruskal(int edgenumber){
    initial();
    int sum=0;
    for(int i=0;i<edgenumber;i++){
        edge e=graph[i];
        if (Find(e.node1)!=Find(e.node2)){
            Union(e.node1,e.node2);
            sum+=e.dist;
        }
    }
    return sum;
}

int main(){
    int n;
    while(cin>>n){
        if(n==0)break;
        int edgenumber=n*(n-1)/2;
        for(int i=0;i<edgenumber;i++)cin>>graph[i].node1>>graph[i].node2>>graph[i].dist;
        sort(graph,graph+edgenumber,compare);
        int sum=kruskal(edgenumber);
        cout<<sum<<endl;
    }
    return 0;
}
全部评论

相关推荐

蔡徐kun:还行,早挂晚挂都是挂。早点挂进池子等别人捞你
点赞 评论 收藏
分享
01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务