求助,并查集+Kruskal改了一符号就ac了,想不出原因
查看原帖
求助,并查集+Kruskal改了一符号就ac了,想不出原因
948229
tutu_6trc楼主2023/3/11 18:00
#include <bits/stdc++.h>
using namespace std;
int n,k;
int ans;
struct edge{
	int u;
	int v;
	int m;
};
int father[100000];
edge e[100000];
int a[100][100];
void Init(int n){
	for(int i=0;i<=n;i++){
		father[i]=i;
	}
}
int findfather(int x){
	int a=x;
	while(x!=father[x]){
		x=father[x];
	}
	return x;
	while(father[a]!=a){
		int z=a;
		a=father[a];
		father[z]=x;
	}
}
bool cmp(edge e1,edge e2){
	return e1.m<e2.m;
}
void kruskal(){
	sort(e+1,e+k+1,cmp);
	int num=0;
	for(int i=1;i<=k;i++){
		int faA=findfather(e[i].u);
		int faB=findfather(e[i].v);
		if(faA!=faB){
			father[faA]=faB;
			ans+=e[i].m;
			num++;
			if(num==n-1)
			break;
	}
}}
int main(){
	cin>>n;
	Init(n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];}}
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			e[k].u=i;
			e[k].v=j;
			e[k].m=a[i][j];
			k++;
		}}
	kruskal();
	cout<<ans;
}

初始化的时候我本来是本来初始化的时候j=i+1,因为对角线元素都是0 但是不对,不加1就ac了,想不明白

2023/3/11 18:00
加载中...