传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3714
前缀和奇偶性
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+10;
struct edge{
int u,v,w;
bool operator<(const edge &E)const{
return w<E.w;
}
}edges[maxn*maxn];
int fa[maxn];
int find(int x){
if(fa[x]!=x)return fa[x]=find(fa[x]);
return x;
}
int n,m;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int x;
scanf("%d",&x);
edges[++m]=(edge){i-1,j,x};
}
}sort(edges+1,edges+1+m);
long long ans=0;
for(int i=1;i<=m;i++){
int u=edges[i].u,v=edges[i].v;
if(find(u)!=find(v)){
fa[find(u)]=find(v);
ans+=edges[i].w;
}
}cout<<ans<<endl;
return 0;
}