zoukankan      html  css  js  c++  java
  • prim和kruskal算法

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

  • 相关阅读:
    day13_迭代器,生成器
    作业礼包
    day12_装饰器进阶
    装饰器作业
    day11_装饰器
    函数作业
    day10-函数进阶
    数据类型-习题解答
    day09_函数
    PHP 完美分页
  • 原文地址:https://www.cnblogs.com/tao7/p/10246726.html
Copyright © 2011-2022 走看看