首页 > 编程语言 > 详细

prim和kruskal算法

时间:2019-01-09 21:17:54      阅读:232      评论:0      收藏:0      [点我收藏+]
//邻接矩阵 
int n,G[MAXV][MAXN];
int d[MAXV];//表示到树的距离 
bool vis[MAXV]={false};
int prim(){
	fill(d,d+MAXV,INF);
	d[0]=0;
	int ans=0;
	for(int i=0;i<n;i++){
		int u=-1;MIN=INF;
		for(int j=0;j<n;j++){
			if(vis[j]==false&&d[j]<MIN){
				u=j;
				MIN=d[j];//dj一个套路 
			}
		}
		if(u==-1) return -1;
		vis[u]=true;
		ans+=d[u];
		for(int v=0;v<n;v++){
			if(vis[v]==false&&G[u][v]!=INF&&G[u][v]<d[v]){
				d[v]=G[u][v];
			}
		} 
	}
	return ans;
}
//邻接表 
struct Node{
	int v,dis;
};
vector<Node>Adj[MAXV];
int n,d[mAXV];
bool vis[MAXV]={false};
int prim(){
	fill(d,d+MAXV,INF);
	d[0]=0;
	int ans=0;
	for(int i=0;i<n;i++){
		int u=-1,MIN=INF;
		for(int j=0;j<n;j++){
			if(vis[j]==false&&d[j]<MIN){
				u=j;
				MIN=d[j];
			}
		} 
		if(u==-1) return -1;
		vis[u]=true;
		ans+=d[u];
		for(int j=0;j<Adj[u].size();j++){
			int v=Adj[u][j].v;
			if(vis[v]==false&&Adj[u][j].dis<d[v]){
				d[v]=G[u][v];
			}
		}
	}
	return ans;
}

  和dj一个套路,不同点就是d[MAXV]在dj中表示到起点的最短路径,但是在prim中表示的是到树的最小距离

 

 

kruskal算法的时间复杂度是ElogE,E表示边数,所以该算法适合顶点多而边数少的情况,这与prim算法相反,所以稠密图用prim稀疏图用kruskal

prim和kruskal算法

原文:https://www.cnblogs.com/tao7/p/10246726.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!