Kruskal 如何优化内存
查看原帖
Kruskal 如何优化内存
1190741
Violet_Evergardon楼主2024/8/12 11:47

#8#9#10MLE #13TLE

我是直接存边,用两条有向边表示一条无向边

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
const int N=5005;
const int M=2e5+5;
int n,m,cnt,ans;
int fa[N];
struct B{
	int u,v,w;
}edge[M];
struct cmp{
	bool operator()(B a,B b){return a.w>b.w;}
};
priority_queue<B,vector<B>,cmp>	q;
int find(int a){
	if(fa[a]!=a)	return fa[a]=find(fa[a]);
	return fa[a];
}
void jianbian(int a,int b,int c){
	edge[++cnt].u=a,edge[cnt].v=b,edge[cnt].w=c;
	q.push(edge[cnt]);
}
void mix(int a,int b)
{
	if(fa[a]==fa[b])	return ;
	fa[a]=find(a),fa[b]=find(b);
	fa[fa[b]]=fa[a];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		jianbian(a,b,c);jianbian(b,a,c);
	}
	
	//Kruskal
	for(int i=1;i<=n-1;i++)
	{
		B t=q.top();
		while(find(t.u)==find(t.v)) q.pop(),t=q.top();
		ans+=t.w;
		mix(t.v,t.u);
	}
	
	for(int i=2;i<=n;i++)
		if(find(1)!=find(i))
		{
			cout<<"orz"<<endl;
			return 0;
		}
	cout<<ans<<endl;
	return 0;	
}
2024/8/12 11:47
加载中...