洛谷 - P1194 买礼物
早过了,但O2会爆
于是进行面向题解的编码
裸kruskal
#include<bits/stdc++.h>
using namespace std;
struct node {
int x,y,s;
} d[200000];
int n,m,ans,num,f[1000],w,k,c;
bool ok[1000];
bool cmp(node a,node b){
return a.s<b.s;
}
int gf(int x){
if(f[x]==x)return x;
return f[x]=gf(f[x]);
}
void kruskal(){
int x,y;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=k-num;i++){
x=gf(d[i].x);
y=gf(d[i].y);
if(x!=y){
f[x]=y;
c++;
ans+=d[i].s;
}
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>w;
if(i>=j||w==0)continue;
d[++k].x=i;
d[k].y=j;
d[k].s=w;
if(d[k].s>m)num++;
}
sort(d+1,d+k+1,cmp);
kruskal();
if(c==n-1)cout<<ans+m;
else cout<<ans+(n-c)*m;
return 0;
}

浙公网安备 33010602011771号