zoukankan      html  css  js  c++  java
  • P3366 【模板】最小生成树

    题目描述

    如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz

    输入输出格式

    输入格式:

    第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)

    接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi

    输出格式:

    输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    struct edge{
        ll u,v,w;
    }e[200000+10];
    bool cmp(const edge &a,const edge &b)
    {
            return a.w<b.w;
    }
    ll f[200005],n,m,ans,cnt;
    ll find(ll x)
    {
        if(f[x]!=x)
    	f[x]=find(f[x]);
        return f[x];
    }
    void kruskal()
    {
        sort(e,e+m,cmp);
        for(int i=0;i<m;i++)
    	{
            ll u=e[i].u, v=e[i].v, w=e[i].w;
            ll fu=find(u), fv=find(v);
            if(fu==fv) continue;
            ans+=w;
            f[fv]=fu; cnt++;
            if(cnt==n-1) break;
        }
    }
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
    	{
    		f[i]=i;
    	}
        for(int i=0;i<m;i++)
    	{
            scanf("%lld %lld %lld",&e[i].u,&e[i].v,&e[i].w);
        }
        kruskal();
        if(cnt!=n-1)
        {
        	printf("orz");
    	}
        printf("%lld",ans);
        return 0;
    }


  • 相关阅读:
    个人介绍
    2021-03-16 助教小结
    2020软件工程作业05
    2020软件工程作业04
    2020软件工程作业03
    第二次作业 计划与执行
    从蓝天到名利 所有你想要的 都别随风去
    Android Task 相关
    Android ViewDragHelper源码解析
    android利用反射通过代码收缩通知栏
  • 原文地址:https://www.cnblogs.com/ztz11/p/9189971.html
Copyright © 2011-2022 走看看