最小生成树——Prime算法模板

Prime算法思路

1.我们先设两个顶点集合,一个为加入最小生成树的顶点集合X,另一个为未加入最小生成树的顶点集合Y
2.如果X中没有结点,选任意一个结点将其放入X中,接下来重复下面的过程:从X中找到关联权值最小的边且这条边的另一个结点在Y中,将该结点加入X中。直到有n个结点处于X中(既Y中无结点),则停止寻找。
3.得到的图则为最小生成树

Prime算法用于稠密图时效率更高

Prime算法模板

时间复杂度为O(n^2)

const int INF=1<<30;
int vis[maxn]  //vis[i]=1 则表示点i在X中,反之则在Y中
int w[maxn][maxn]  //w[i][j]表示边(i,j)的权值
int dis[maxn]  //dis[i]表示当前X的所有顶点中到i的最小权值
int Prime(){
	memset(vis,0,szieof(vis));
	int ans=0;
	vis[1]=1;    //将第一个点加入X
	for(int i=2;i<=n;i++) dis[i]=w[1][j];
	for(int i=1;i<n;i++) {  //再找n-1个点
		int k,temp=INF;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&dis[j]<temp){
				k=j;
				temp=dis[j];
			}
		}
		vis[k]=1;	//将k从Y加入X中
		ans+=temp;
		for(int j=1;j<=n;j++){   //更新到各个点的最短距离
			if(!vis[j]&&dis[j]>w[k][j]) dis[j]=w[k][j];
		}
	}
	return ans;
} 

如有错误,欢迎指出

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页