P3366 kruskal模板题

Posted kohano

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3366 kruskal模板题相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <algorithm>
using namespace std;
const int maxm=100000;
const int maxn=5000;
int tot;

struct edge{
    int u,v,w;
}e[maxm*2];

int father[maxn];
void make(int n){
    for(int i=0;i<n;i++)    //初始化 
        father[i]=i;    //令每个元素的父亲都是元素本身 
}

int find(int x){
    if(x!=father[x])    //若父亲不为本身,则寻找元素x的祖先 
        father[x]=find(father[x]);    //通过寻找元素x父亲的父亲找到祖先 
    return father[x];            //返回元素x的祖先 
} 

int cmp(edge a,edge b){
    return a.w<b.w;
}

void work(int i){
    tot=tot+e[i].w;
}

bool kruskal(int n,int m){
    int cnt=0;
    make(n);
    sort(e,e+m,cmp);
    for(int i=1;i<=m;i++)
    {
        int u=e[i].u,v=e[i].v;
        if(find(u)!=find(v))
        {
            father[find(u)]=find(v);
            work(i);
            cnt++;
        }
        if(cnt==n-1) break;
    }
    if(cnt!=n-1) return false;
    return true;
}

int main(){
    int N,M;
    cin>>N>>M;
    for(int i=1;i<=M;i++){
        int X,Y,Z;
        cin>>X>>Y>>Z;
        e[i].u=X,e[i].v=Y,e[i].w=Z;
    }
    if(kruskal(N,M)) cout<<tot<<endl;
    else cout<<"orz"<<endl;    
    return 0;
}

 

以上是关于P3366 kruskal模板题的主要内容,如果未能解决你的问题,请参考以下文章

P3366 模板最小生成树(kruskal算法)

P3366 模板最小生成树 (贪心+并查集,kruskal)

P3366 模板最小生成树 (贪心+并查集,kruskal)

还是畅通工程 HDU - 1233Kruskal模板题

最小生成树模板题POJ - 1287-prim+kruskal

洛谷P3366 模板最小生成树