最小生成树模板Prim与Kruskal

Kruskal算法

int fa[maxn];
struct edge
{
	int u,v,w;
}E[maxn];
bool cmp(const edge &a,const edge &b){return a.w<b.w;}
void merge(int u,int v){fa[find(u)]=find(v);}
int find(int u){return fa[u]==u?u:fa[u]=find(fa[u]);}
int kruskal()
{
	sort(E+1,E+m+1,cmp);
	for(int i=1;i<=n;i++)fa[i]=i;
	int ans=0;
	for(int i=1;i<=m;i++)
	{
		int u=E[i].u,v=E[i].v,w=E[i].w;
		if(find(u)==find(v))
		continue;
		merge(u,v);
		ans+=w;
	}
	return ans;
}

Prim算法

int prim()
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=inf;
		pre[i]=0;
		vis[i]=0;
	}
	vis[1]=1;
	dis[1]=0;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		int u=0,mn=inf;
		for(int j=1;j<=n;j++)
		if(!vis[j]&&mn>dis[j])
		{
			mn=dis[j];
			u=j;
		}
		vis[u]=1;
		ans+=mn;
		for(int v=1;v<=n;v++)
		if(!vis[v]&&g[u][v]<dis[v])
		{
			pre[v]=u;
			dis[v]=g[u][v];
		}
	}
	return ans;
}

在稀疏图中邻接矩阵不够划算
可以用邻接表代替
而且,可以用优先队列存权
可升级为:

bool vis[maxn];
struct node
{
	int v,w;
	node (int v=0,int w=0):v(v),w(w){};
	bool operator<(node x)const 
	{
		return w>x.w;
	}
}
vector<node>G[maxn];
void add_edge(int u,int v,int w)
{
	node x;
	x.w=w;
	x.v=v;
	G[u].push_back(x);
}
int prim()
{
	priority_queue<node>Q;
	Q.push(node(1,0));
	int ans=0;
	vis[1]=1;
	while(!Q.empty())
	{
		node u=Q.top();
		Q.pop();
		if(vis[u.v])continue;
		ans+=u.w;
		vis[u.v]=1;
		for(int i=0;i<G[u].size();i++)
		{
			int v=G[u][i].v;
			int w=G[u][i].w;
			if(!vis[v])Q.push(node(v,w));
		}
	}
	return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值