码迷,mamicode.com
首页 > 编程语言 > 详细

prim和kruskal算法

时间:2019-01-09 21:39:17      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:就是   复杂度   邻接矩阵   nod   return   不同   tor   cto   for   

//邻接矩阵 
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算法

标签:就是   复杂度   邻接矩阵   nod   return   不同   tor   cto   for   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!