#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