用最小生成树的Kruskal去做,WA 40分
#include<bits/stdc++.h>
using namespace std;
int n,m,leader[100005],t,x,y,s=0;
long long ans=0;
struct node{
int num,d1,d2;
}ns[200005];
bool cmp(node x,node y){
return x.num<y.num;
}
int find(int x){
if(leader[x]==x){
return x;
}else{
return leader[x]=find(leader[x]);
}
}
void merger(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy) leader[fx]=fy;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
leader[i]=i;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>t;
if(i==j||j<=i){
continue;
}
ns[++s].d1=i;
ns[s].d2=j;
ns[s].num=t;
}
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
merger(x,y);
}
sort(ns+1,ns+s+1,cmp);
int line=0;
for(int i=1;i<=m;i++){
if(find(ns[i].d1)!=find(ns[i].d2)){
ans+=ns[i].num;
merger(ns[i].d1,ns[i].d2);
line++;
}
if(line==n-1){
break;
}
}
cout<<ans;
return 0;
}
求帮助