最小生成树

模板

prim

#include<cstdio>
#include<iostream>
using namespace std;
int m,n;
int fst[5005];
int nxt[400005];
int v[400005];
int k[400005];
int used[40005];
int dis[40005];
int edge;
void add(int x,int y,int val)
{
	edge++;
	nxt[edge]=fst[x];
	fst[x]=edge;
	v[edge]=y;
	k[edge]=val;
}
const int inf=1000000000;
int main()
{
	scanf("%d%d",&n,&m);
	int x,y,val;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&val);
		add(x,y,val);
		add(y,x,val);
	}
	for(int i=1;i<=n;i++)
	dis[i]=inf;
	int ans=0;
	int now=1;
	for(int i=1;i<n;i++)
	{	
	    //cout<<now<<endl;
		used[now]=1;
		dis[now]=0;
		int minn=inf;
		for(int j=fst[now];j;j=nxt[j])
		{
			if(k[j]<dis[v[j]])
			{
				dis[v[j]]=k[j];
			}
		}
		for(int j=1;j<=n;j++)
		{
			if(!used[j]&&dis[j]<minn)
			{
				now=j;
				minn=dis[j];
			}
		}
		ans+=minn;
	}
	for(int i=1;i<=n;i++)
	{
		if(dis[i]==inf)
		{
			printf("orz");
			return 0;
		}
	}
	printf("%d",ans);
	return 0;
}

kruscal算法

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
struct poi
{
	int x,y,v;
}a[200005];
int fa[5005];
int find(int x)
{
	if(x==fa[x])return x;
	return fa[x]=find(fa[x]);
}
bool cmp(poi a,poi b)
{
	return a.v<b.v;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	int ans=0;
	for(int i=1;i<=m;i++)
	{
		int x=find(a[i].x);
		int y=find(a[i].y);
		if(x==y)continue;
		ans+=a[i].v;
		fa[x]=y;
	}
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(fa[i]==i)cnt++;
	}
	if(cnt>1)
	{
		printf("orz");
		return 0;
	}
	printf("%d",ans);
	return 0;	
}

 

posted @ 2018-07-19 14:31  Richardluan  阅读(2)  评论(0)    收藏  举报