Prim算法14分求调

P3366 【模板】最小生成树

lutaoquan2012 @ 2023-11-29 18:37:38

//
// Created by 55062 on 2023/11/29.
//
#include<bits/stdc++.h>
using namespace std;
int n,vis[5010],cost[5010],v[5010][5010],ans,m;//cost:每次到第i个点的最短距离
int main(){
    cin>>n>>m;
    memset(cost,0x3f,sizeof(cost));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) v[i][j]=-1;
    for(int i=1;i<=m;i++){
        int u,vv,w;
        cin>>u>>vv>>w;
        v[u][vv]=w;
        v[vv][u]=w;
    }
    cost[1]=0;
    for(int i=1;i<=n;i++) v[i][i]=0;
    for(int i=1;i<=n;i++){
        int u=0;
        for(int j=1;j<=n;j++)
            if(v[i][j]!=-1&&vis[j]==0&&cost[j]<cost[u]) u=j;
        ans+=cost[u];
        vis[u]=1;
        for(int j=1;j<=n;j++)
            if(v[i][j]!=-1&&vis[j]==0&&cost[j]>v[u][j]) cost[j]=v[u][j];
    }for(int i=1;i<=n;i++)
        if(cost[i]>=0x3f3f3f3f){
            cout<<"orz";
            exit(0);
        }
    cout<<ans;
    return 0;
}

by AK_CSPS @ 2023-11-29 18:58:43

存在一个潜在的错误,即当图不连通时,程序会输出"orz",但实际上,这并不一定意味着图不连通,而有可能是cost数组中的值没有被更新到。因此,如果需要更准确地判断图是否连通,可以使用其他算法或方法进行验证。另外,程序中使用了一个很大的值来初始化cost数组,但这个值可能会超过int类型的最大值,因此需要注意。


by wosile @ 2023-11-29 19:12:04

@GDD_lutaoquan2012 本题输入有重边。你需要在所有重边中取边权最小的一条。


by wosile @ 2023-11-29 19:12:27

@jiang1008 你在瞎jb说什么东西。


by 1q2zb @ 2023-12-25 21:14:02

@wosile 谢谢大佬提醒!


|