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;
    }


  • 相关阅读:
    COGS727 [网络流24题] 太空飞行计划
    Bzoj1692 洛谷P2870 [Usaco2007 Dec]队列变换
    Bzoj1029 [JSOI2007]建筑抢修
    Bzoj3168 [Heoi2013]钙铁锌硒维生素
    Bzoj4566 [Haoi2016]找相同字符
    Bzoj4771 七彩树
    Bzoj2597 [Wc2007]剪刀石头布
    Bzoj4773 负环
    HDU5772 String problem
    Bzoj1324 Exca王者之剑
  • 原文地址:https://www.cnblogs.com/ztz11/p/9189971.html
Copyright © 2011-2022 走看看