51Nod 1640 天气晴朗的魔法 (最大生成树&&最小生成树)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
    ll u, v, w;
}edge[200005];
bool cmp(struct node a, struct node b)
{
    return a.w < b.w;
}
bool cmp2(struct node a, struct node b)
{
    return a.w > b.w;
}
ll pre[200005];
ll fin(ll x){return pre[x] == x ? x : pre[x] = fin(pre[x]);}
int main()
{
    ll n, m, i, j, k;
    scanf("%lld %lld", &n, &m);
    for(i = 1; i <= m; i++)
    {
        scanf("%lld %lld %lld", &edge[i].u, &edge[i].v, &edge[i].w);
    }
    for(i = 1; i <= n; i++)pre[i] = i;
    sort(edge + 1,edge + 1 + m, cmp);
    ll maxx = 0;
    for(i = 1; i <= m; i++)
    {
        ll xx = fin(edge[i].u);
        ll yy = fin(edge[i].v);
        if(xx != yy)
        {
            pre[xx] = yy;
            maxx = max(maxx, edge[i].w);
        }
    }
    for(i = 1; i <= n; i++)pre[i] = i;
    sort(edge + 1, edge + 1 + m, cmp2);
    ll ans = 0;
    for(i = 1; i <= m; i++)
    {
        if(edge[i].w <= maxx)
        {
            ll xx = fin(edge[i].u);
            ll yy = fin(edge[i].v);
            if(xx != yy)
            {
                pre[xx] = yy;
                ans += edge[i].w;
            }
        }
    }
    printf("%lld\n", ans);
    return 0;

}

猜你喜欢

转载自blog.csdn.net/Miracle_QSH/article/details/82192316