求助!并查集+Kruskal,可是样例。。。
查看原帖
求助!并查集+Kruskal,可是样例。。。
1070708
Caged_Bird楼主2023/11/9 22:19

有控制并查集大小,可样例还是输出0。

#include<bits/stdc++.h>
using namespace std;
int n,m,pre[505],size[505],mp[505][505],t;
struct node{
	int u,v,w;
};
vector<node>a;
int find(int x){
	if(pre[x]==x)return x;
	return pre[x]=find(pre[x]);
} 
int un(int x,int y){
	int fx=find(x),fy=find(y);
	pre[fy]=fx;
	size[fx]+=size[fy];
	if(size[fx]>=t)return 1;
	return 0;
}
int abs(int x){
	if(x>0)return x;
	return -x;
}
bool cmp(node a,node b){
	return a.w<b.w;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>mp[i][j];
			if(j!=1)
				a.push_back(node{n*(i-1)+j-1,n*(i-1)+j,abs(mp[i][j]-mp[i][j-1])});
			if(i!=1)
				a.push_back(node{n*(i-2)+j,n*(i-1)+j,abs(mp[i][j]-mp[i-1][j])});
		}
	}
	for(int i=1;i<=n;i++){pre[i]=i;size[i]=1;}
	t=(n+1)/2;
	sort(a.begin(),a.end(),cmp);
	int i=0;
	while(1){
		if(find(a[i].u)!=find(a[i].v)){
			if(un(a[i].u,a[i].v)){
				cout<<a[i].w;
				return 0;
			}
		}
		i++;
	}
	return 0;
}
 

。。。。。。求助dalao

2023/11/9 22:19
加载中...