萌新求助
查看原帖
萌新求助
720455
Rain_Carnation楼主2022/5/27 10:45

rt,已经会正解了但是先写了一个裸的暴力 kruskal,可是不知道为什么样例过不去,可以帮忙看看嘛

#include<iostream>
#include<algorithm>
using namespace std;
struct edge{
	int u,v,w;
}e[500010];
bool cmp(const edge &a,const edge &b){
	return a.w<b.w;
}

int fa[100010];
int find(int x){
	if(fa[x]!=x) fa[x]=find(fa[x]);//路径压缩 
	return fa[x];
}

int n,m;
int a[500050],b[500050],maxx=-99999999;

int make(int x,int y){
	return m*(x-1)+y-1;
}

int main(){
	cin>>n>>m;
	int cnt=0;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1;i<=m;++i) cin>>b[i];
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j){
			if(j<n) e[++cnt].u=make(i,j); e[cnt].v=make(i,j+1); e[cnt].w=a[i];
			if(i<n) e[++cnt].u=make(i,j); e[cnt].v=make(i+1,j); e[cnt].w=b[j];
		}
	cout<<cnt<<endl;
	sort(e+1,e+cnt+1,cmp);
	long long sum=0;
	int vis=0;
 	for(int i=1;i<=1000100;++i) fa[i]=i;
 	for(int i=1;i<=cnt;++i){
		int root_u=find(e[i].u);
		int root_v=find(e[i].v);
		if(root_u==root_v) continue;
		sum+=e[i].w;
		fa[root_u]=root_v; ++vis;
		cout<<e[i].u<<e[i].v<<endl;
		if(vis==n*m-1) break;
	}
	cout<<sum<<endl; 
}

2022/5/27 10:45
加载中...