zoukankan      html  css  js  c++  java
  • tyvj1659救援队——最小生成树

    题目:http://www.joyoi.cn/problem/tyvj-1659

    想清楚了是非常简单的最小生成树:

    1、树中每条边都会被走两边;

    2、每个点会走度数遍,起点又多走一遍;

    根据以上两条处理边权,即输入的边权*2+两边点的点权,这样每个点都被加了度数遍;

    再求最小生成树,答案加上点权最小的一个(起点)即可。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int n,m,ct,s[10005],fa[10005],mn=1e9;
    ll ans;
    struct N{
        int hd,to,w;
        N(int h=0,int t=0,int ww=0):hd(h),to(t),w(ww) {}
    }edge[200005];
    bool cmp(N x,N y)
    {
        return x.w<y.w;
    }
    int find(int x)
    {
        if(fa[x]==x)return x;
        return fa[x]=find(fa[x]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&s[i]);
            mn=min(mn,s[i]);
            fa[i]=i;
        }
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            edge[++ct]=N(x,y,z*2+s[x]+s[y]);
        }
        sort(edge+1,edge+ct+1,cmp);
        for(int i=1;i<=ct;i++)
        {
            int u=edge[i].hd;
            int v=edge[i].to;
            if(find(u)!=find(v))
            {
                fa[find(u)]=find(v);
                ans+=edge[i].w;
            }
        }
        ans+=mn;
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    oracle行转列
    JVM设置空间大小
    Spring AOP 业务权限管理
    清晨漫步
    pull解析xml(android)
    今昔何昔
    Spring: Document root element "beans", must match DOCTYPE root "null
    xfire
    心之所向
    Oracle数据库连接
  • 原文地址:https://www.cnblogs.com/Zinn/p/8627512.html
Copyright © 2011-2022 走看看