用 Kruskal 写的,样例全没过。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=9e18;
int n,m,num;
struct node
{
int u,v,w;
}edge[600010];
struct bcj
{
int fa[200010];
void init(int n)
{
for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{
x=find(x),y=find(y);
if(x!=y)fa[x]=y;
}
bool same(int x,int y)
{
return find(x)==find(y);
}
}ds;
bool cmp(node a,node b)
{
return a.w<b.w;
}
int kruskal(int x,int y)
{
int mst=0,cnt=0;
ds.init(n+2);
for(int i=1;i<=num;i++)
{
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(ds.same(u,v))continue;
mst+=w;
//printf("mst:%lld\n",mst);
cnt++;
}
//printf("mst:%lld\n",mst);
return mst;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
edge[++num].u=n+1;
edge[num].v=i;
edge[num].w=x;
}
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
edge[++num].u=n+2;
edge[num].v=i;
edge[num].w=x;
}
for(int i=1;i<=m;i++)
{
num++;
cin>>edge[num].u>>edge[num].v>>edge[num].w;
}
sort(edge+1,edge+1+num,cmp);
cout<<min(min(kruskal(0,0),kruskal(1,0)),min(kruskal(0,1),kruskal(1,1)));
return 0;
}