AC记录1 https://www.luogu.com.cn/record/201227566
#include <bits/stdc++.h>
#define ll long long
#define lll unsigned long long
#define dou double
#define ld long double
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define INF 1234567891
using namespace std;
struct node
{
int st,en,w;
}a[250011];
int n,m,fa[511],sum,ans,t;
bool cmp(node x,node y)
{
return x.w<y.w;
}
int find(int x)
{
while(x!=fa[x]) x=fa[x]=fa[fa[x]];
return x;
}
void Kurskal()
{
sort(a+1,a+1+sum,cmp);
for(int i=1;i<=sum;i++)
{
int x,y;
x=find(a[i].st);
y=find(a[i].en);
if(x==y) continue;
fa[x]=y;
ans+=a[i].w;
t++;
if(t==m) break;
}
return ;
}
int main()
{
IOS;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
int x;
cin>>x;
if(i<j&&x)
{
sum++;
a[sum].st=i;
a[sum].en=j;
a[sum].w=x;
}
}
sum++;
a[sum].st=0;
a[sum].en=i;
a[sum].w=n;
fa[i]=i;
}
fa[0]=0;
Kurskal();
cout<<ans<<endl;
return 0;
}
Kurksal部分t==m时退出是正确的
AC记录2 https://www.luogu.com.cn/record/201227220
void Kurskal()
{
sort(a+1,a+1+sum,cmp);
for(int i=1;i<=sum;i++)
{
int x,y;
x=find(a[i].st);
y=find(a[i].en);
if(x==y) continue;
fa[x]=y;
ans+=a[i].w;
t++;
if(t>n) break;
}
return ;
}
Kurskal中是t>n时退出,按照题意是错误的,但是提交上去是AC的
蒟蒻感觉数据可能有点水