【模板题】最小生成树

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1486

这题在比赛时卡了我许久,看了许久用最短路改变一下条件写了一个,TLE了,然后就没办法了,后来看了题解,这么简单的题竟然除了我还有人没做出来

我来实验室的时候最小生成树的学习已经跳过了,然后这类题后来也没接触过,还是学的不够啊

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <stack>
#include <queue>
#include <sstream>
#include <vector>
#include <set>

using namespace std;

const int maxn=100005;

struct node
{
    int u,v,w;
}a[maxn];

int n,m,ans,num;
int pre[10005];

int cmp(struct node a,struct node b)
{
    return a.w<b.w;
}

int find(int x)
{
    if(x!=pre[x])
    pre[x]=find(pre[x]);
    return pre[x];
}

void kruskal()
{
    for(int i=0;i<m;i++)
    {
        int fx=find(a[i].u);
        int fy=find(a[i].v);
        if(fx!=fy)
        {
            pre[fx]=fy;
            num++;
            ans=max(ans,a[i].w+n-num);//关键部分,我来说下,这是每一条路的要花费的魔法值,因为每建一条路就要减一费,而且建成后绝对是一个树,所以n-num是预计他还要花掉多少费
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            pre[i]=i;
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
        }
        sort(a,a+m,cmp);
        ans=0;
        num=1;
        kruskal();
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/PWeiDa/article/details/82594933