克鲁斯卡尔Krukal算法70pts 和一些疑问
查看原帖
克鲁斯卡尔Krukal算法70pts 和一些疑问
666796
Rainsleep楼主2022/6/23 23:03
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N(2e5+10);

int n;

int g[5000][5000];

ll res(0);

int f[10000001];

int cnt(0);

struct Edge
{
    int from;
    int to;
    int w;
}edges[N];

inline bool cmp(Edge x,Edge y)
{
    return x.w<y.w;
}

inline int find(int x)
{
    if(f[x]==x)
        return x;
    return f[x]=find(f[x]);
}

inline void merge(int x,int y)
{
    f[x]=y;
    return ;
}

inline bool judge(int x,int y)
{
    x=find(x);
    y=find(y);
    return (x==y);
}


int main()
{
    scanf("%d",&n);
    
    for(int i(1);i<=n;++i)
        f[i]=i;
    
    for(int i(1);i<=n;++i)
        for(int j(1);j<=n;++j)  
            scanf("%d",&g[i][j]);
    
    for(int i(1);i<=n;++i)
        for(int j(1);j<=n;++j)
            if(g[i][j])
                edges[++cnt]={i,j,g[i][j]};
            
    sort(edges+1,edges+1+cnt,cmp);
    
    for(int i(1),Num_cnt(1);i<=cnt and Num_cnt<n;++i)
    {
        int from(edges[i].from);
        int to(edges[i].to);
        int w(edges[i].w);
        
        if(!judge(from,to))
        {
            res+=w;
            merge(from,to);
            ++Num_cnt;
        }
    }
    
    printf("%lld",res);
    
    puts("");

    return 0;
}

上为70pts代码,当我以为问题出在

Num_cnt<n

时,我将其改为了

Num_cnt<=n

评测记录

2022/6/23 23:03
加载中...