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 谢谢大佬提醒!