最小生成树的prim及kruskal模版

两个月前写的模板,忘记存blog了
prim

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2e5+5;
int n, m, f[maxn][maxn],tot,dis[maxn],s;
bool vis[maxn];
void prim()
{
	memset(dis,0x3f,sizeof(dis));
	vis[s]=true;
	dis[s]=0;
	for(int i=1;i<=n;++i) dis[i]=f[s][i];
	for(int i=1;i<n;++i)
	{
		int k=0;
		min1=0x3f3f3f3f;
		for(int j=1;j<=n;++j)
		{
			if(!vis[j]&&(dis[j]<min1))
			{
				min1=dis[j];
				k=j;
			}
			vis[k]=true;
			for(int j=1;j<=n;++i)
			{
				dis[j]=min(dis[j],f[k][j]);	
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);	
	return 0;	
}

kruskal

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5,maxm=2e5+5;
int n,m,fa[maxn],tot,k;
struct mint
{
	int x,y,w;	
}a[maxm];
bool cmp(mint a,int b)
{
	return a.w<b.w;
}
int find(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);		
}
void kruskal()
{
	for(int i=1;i<=n;++i) fa[i]=i;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;++i)
	{
		int fa1=find(a[i].x),fa2=find(a[i].y);
		if(fa1!=fa2)
		{
			fa[fa1]=fa[fa2];
			tot+=a[i].w;
			k++;
			if(k==n-1)
			{
				printf("%d",tot);
				return 0;
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		a[i].x=a;
		a[i].y=b;
		a[i].w=c;	
	}
	kruskal();
	return 0;	
}
posted @ 2021-08-14 16:43  Mint-hexagram  阅读(22)  评论(0编辑  收藏  举报