哪错了啊?错哪了啊?哪啊错了?

P3366 【模板】最小生成树

GODTREE @ 2023-07-05 16:27:11

#include <bits/stdc++.h>
using namespace std;
int n,m,f[5005];int sum=0,num=0;
struct edge
{
    int nxt,to,val;
}e[5005];
bool cmp(edge a,edge b)
{
    return a.val<b.val;
}
int get_f(int u)
{
    if (f[u]==0)
    {
        return u;
    }
    return get_f(f[u]);
}
void kru()
{
    for (int i=1;i<=n;i++)
    {
        f[i]=i;
    }
    sort(e+1,e+m+1,cmp);
    for (int i=1;i<=m;i++)
    {
        f[e[i].nxt]=get_f(e[i].nxt);
        f[e[i].to]=get_f(e[i].to);
        if (f[e[i].nxt]!=f[e[i].to])
        {
            num++;
            sum+=e[i].val;
            f[e[i].nxt]=e[i].to;
        }
        if (num==n-1)
        {
            break;
        }
    }
}  
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>e[i].nxt>>e[i].to>>e[i].val;
    }
    kru();
    if(num<n-1)
    {
        cout<<"orz";
    }
    else
    {
        cout<<sum;
    }
    return 0;
}

by Misophiliac @ 2023-07-05 16:47:38

@GODTREE get_f 函数中 if (f[u]==0)-->if (f[u]==u)


by GODTREE @ 2023-07-05 16:52:28

@yuanxiuan 谢谢大佬


by GODTREE @ 2023-07-05 16:59:39

还是无法AC


by pj114514 @ 2023-07-06 16:15:19

改成这样就对了,看一下,有注释的地方改过 你这个数组开小了,而且并查集写的不对

#include <bits/stdc++.h>
using namespace std;
int n,m,f[5005];
int sum=0,num=0;
struct edge
{
    int nxt,to,val;
}e[200005];//数组开小了,这里是边的数量
bool cmp(edge a,edge b)
{
    return a.val<b.val;
}
int get_f(int u)
{
    if (f[u]==u)//看一下
    {
        return u;
    }
    return f[u]=get_f(f[u]);//返回时修改
}
void kru()
{
    for (int i=1;i<=n;i++)
    {
        f[i]=i;
    }
    sort(e+1,e+m+1,cmp);
    for (int i=1;i<=m;i++)
    {
        int f1=get_f(e[i].nxt);
        int f2=get_f(e[i].to);//这两个应该是这样
        if (f1!=f2)//
        {
            num++;
            sum+=e[i].val;
            f[f1]=f2;//
        }
        if (num==n-1)
        {
            break;
        }
    }
}  
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>e[i].nxt>>e[i].to>>e[i].val;
    }
    kru();
    if(num<n-1)
    {
        cout<<"orz";
    }
    else
    {
        cout<<sum;
    }
    return 0;
}

|