求助
查看原帖
求助
541254
BugGod楼主2023/9/2 14:18

用 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;
}
2023/9/2 14:18
加载中...