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;
}