题目id 8209 修路

用最小生成树的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;
}

求帮助

4 个赞