最小生成树

#include <iostream>
#include <algorithm>
const int N=10005;
using namespace std;
struct edge
{
    int u,v,w;
    bool operator <(const edge &b)const
    {
        return this->w < b.w;
    }
}e[N];
int par[N];
void init()
{
    for(int i=0;i<N;i++) par[i]=i;
}
int Find(int x)
{
    if(par[x]==x) return x;
    else return Find(par[x]);
}
int kruscal(int n,int m)
{
    init();
    sort(e,e+m);
    int ans=0;
    for(int i=0;i<m;i++){
        int u=e[i].u,v=e[i].v,w=e[i].w;
        if(Find(u)==Find(v)) continue;
        par[Find(u)]=Find(v);
        ans+=w;
    }
    return ans;
}
int main()
{
    std::ios::sync_with_stdio(false);
    int n,m;
    while(cin>>n&&n){
        m=n*(n-1)/2;
        for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
        cout<<kruscal(n,m)<<endl;
    }
    return 0;
}

 

#include <iostream>
#include <algorithm>
const int N=10005;
using namespace std;
struct edge
{
    int u,v,w;
}e[N];
int par[N];
bool cmp(edge a,edge b)
{
    return a.w<b.w;
}
void init()
{
    for(int i=0;i<N;i++) par[i]=i;
}
int Find(int x)
{
    if(par[x]==x) return x;
    else return Find(par[x]);
}
int kruscal(int n,int m)
{
    init();
    sort(e,e+m,cmp);
    int ans=0;
    for(int i=0;i<m;i++){
        int u=e[i].u,v=e[i].v,w=e[i].w;
        if(Find(u)==Find(v)) continue;
        par[Find(u)]=Find(v);
        ans+=w;
    }
    return ans;
}
int main()
{
    std::ios::sync_with_stdio(false);
    int n,m;
    while(cin>>n&&n){
        m=n*(n-1)/2;
        for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
        cout<<kruscal(n,m)<<endl;
    }
    return 0;
}

 

posted @ 2018-12-30 21:28  wydxry  阅读(185)  评论(0编辑  收藏  举报
Live2D