求助,我连样例都过不了。。。

P3366 【模板】最小生成树

natie @ 2024-08-19 13:13:11

有点乱,求调,谢谢!


#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z,cnt=0,cnt2=0,fa[20010];
int find(int x)
{
    if(x==fa[x])
    {
        return x;
    }
    return fa[x]=find(fa[x]);
}
struct ba{
    int d1,d2,cd;
}a[200010];
bool cmp(ba x,ba y)
{
    return x.cd<y.cd;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
    }
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        a[i].d1=x;
        a[i].d2=y;
        a[i].cd=z;
    }
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if(find(a[i].d1)==find(a[i-1].d1))
        {
            continue;
        }
        fa[find(a[i].d1)]=find(a[i].d2);
        cnt2+=a[i].cd;
        cnt++;
        if(cnt==n-1)
        {
            break;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(find(fa[i])!=find(fa[n])) 
        {
            cout<<"orz";
            return 0;
        }
    }
    cout<<cnt2;
    return 0;
 } ``````

by natie @ 2024-08-19 13:14:33

样例会输出9而不是7


by xujinxuan01 @ 2024-08-19 13:22:17

if(find(a[i].d1)==find(a[i-1].d1))
{
  continue;
}

if(find(a[i].d1)==find(a[i].d2))
{
  continue;
}

即可过。


by natie @ 2024-08-19 13:22:49

谢谢!


by xujinxuan01 @ 2024-08-19 13:23:50

if(find(a[i].d1)==find(a[i-1].d1))
{
  continue;
}

这里i-1是上一条边,而应该判的是该边的两端是否在同一个连通块内,因为最小生成树不能有环。


by natie @ 2024-08-19 13:30:05

其实是大改的时候忘记改了


|