zoukankan      html  css  js  c++  java
  • 最小生成树(kruskal)

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,m;
    int f[5005];
    
    void clean()
    {
        for(int i=1;i<=n;i++)
        {
            f[i]=i;
        }
    }//初始化并查集 
    
    int mf(int v)
    {
        if(f[v]==v) return v;
        else
        {
            f[v]=mf(f[v]);
            return f[v];
        }
    }//找爹 
    
    void mer(int a,int b)
    {
        int af=mf(a);
        int bf=mf(b);
        if(af!=bf)
        {
            f[bf]=af;
        }
    }//合并 
    
    struct make_edge
    {
        int a;
        int b;
        int w;
    };//每条边 
    
    make_edge edge[200005];
    
    bool cmp(make_edge a,make_edge b)
    {
        return a.w<b.w;
    }
    
    int main()
    {
        cin>>n>>m;
        clean();
        for(int i=1;i<=m;i++)
        {
            int a,b,w;
            cin>>a>>b>>w;//有向图无向图都是一条边
            edge[i].a=a;
            edge[i].b=b;
            edge[i].w=w;
        }
        sort(edge+1,edge+m+1,cmp);//排序 
        int count=0;//边数 
        int sum=0;
        for(int i=1;i<=m;i++)
        {
            if(mf(edge[i].a)==mf(edge[i].b)) continue;
            else
            {
                mer(edge[i].a,edge[i].b);
                sum+=edge[i].w;
                count++;
            }
            if(count==n-1)
            {
                break;
            }
        }
        if(count<n-1) cout<<"orz"<<endl;
        else cout<<sum<<endl;
        return 0;
    }
     不需要邻接表
  • 相关阅读:
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS01-线性表
    C博客作业06-结构体&文件
    C博客作业05--指针
    C博客作业04--数组
    C博客作业03--函数
    C博客作业02--循环结构
  • 原文地址:https://www.cnblogs.com/KyleDeng/p/9346001.html
Copyright © 2011-2022 走看看