Kruskal板子

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 100
int V,E,res,father[maxn];
struct edge
{
    int u,v,cost;
}es[maxn];
bool cmp(struct edge a,struct edge b)
{
    return a.cost<b.cost;
}
void init()
{
    for(int i=1;i<=V;i++)
        father[i]=i;
}
int myfind(int x)
{
    int t=x,tt;
    while(father[t]!=t) t=father[t];
    while(t!=x)
    {
        tt=father[x];
        father[x]=t;
        x=tt;

    }
    return t;

}
int same(int u,int v)
{
    if(myfind(u)==myfind(v))
        return 1;
    return 0;
}
void unite(int x,int y)
{
    x=myfind(x);
    y=myfind(y);
    father[x]=y;
}
void kruskal()
{
    init();
    sort(es,es+E,cmp);
    for(int i=0;i<E;i++)
    {
        if(!same(es[i].u,es[i].v))
        {
            unite(es[i].u,es[i].v);
            res+=es[i].cost;
        }
    }


}
int main()
{
    cin>>V>>E;
    for(int i=0;i<E;i++)
    {
        cin>>es[i].u>>es[i].v>>es[i].cost;
    }
    kruskal();
    cout<<res<<endl;

}
//
5 2
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
//
#include<bits/stdc++.h>//终极版
using namespace std;
struct edge
{
    int u,v;
    int cost;
}e[500000+10];
int father[100000+10];
bool cmp(const edge&a,const edge&b)
{
    return a.cost<b.cost;
}
int ifind(int x)
{
    if(x!=father[x])
       return  father[x]=ifind(father[x]);
    else
        return x;
}
int main()
{
    int n,m;
    int ans=0;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        int cost;
        scanf("%d %d %d",&u,&v,&cost);
        e[i].u=u;
        e[i].v=v;
        e[i].cost=cost;
    }
    for(int i=1;i<=n;i++)
        father[i]=i;
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int u=e[i].u,v=e[i].v;
        int cost=e[i].cost;
        int uz=ifind(u),vz=ifind(v);
        if(uz==vz) continue;
        father[uz]=vz;
        ans+=cost;
    }
    cout<<ans<<endl;
    return 0;


}

 

posted @ 2018-08-19 19:13  eason99  阅读(82)  评论(0编辑  收藏  举报