java Prim算法

先是数据结构定义--邻接表

//弧的节点结构类型
class ANode implements Comparable<ANode>{
    int adjVertex;        //指向顶点在adjList的下标
    ANode nextArc;        //指向下一条弧
    int value;            //存放权值
    
    @Override
    public int compareTo(ANode o) {
        // TODO Auto-generated method stub
        if(this.value>o.value)
            return 1;
        else if(this.value<o.value)
            return -1;
        else            
            return 0;
    }
}


//邻接表节点的类型
class VNode{            
    String name;        //顶点信息
    ANode firstArc;        //指向第一条弧
}

//图的邻接表类型
class ALGraph{    
    VNode[] adjList;
    int n;                //图的顶点数n
    int e;                //图的边数e
    
    public void prim(ALGraph AG,int[] visited,int[] dis){
    //visited:数组用于记录顶点是否已加入连通集合
    //dis:到已连通集合的最短距离
        PriorityQueue<ANode> queue = new PriorityQueue<ANode>();    //优先队列

        VNode v = null;
        ANode e = null;
        int end;
        
        //初始化
        for(int i=1;i<=AG.n;i++)
            dis[i] = 10000;
        
        visited[1] = 1;     将顶点1加入连通集合
        System.out.println(AG.adjList[1].name);
        
        v = AG.adjList[1];
        e = v.firstArc;
        while(e!=null){         处理与顶点1相连的顶点
            if(e.value<dis[e.adjVertex]){
                dis[e.adjVertex] = e.value;     //跟新dis数组
                queue.add(e);                   //将边加入队列
            }
            e = e.nextArc;
        }
        
        while(!queue.isEmpty()){    
            e = queue.poll();       //取出队列的头元素,即与连通集合距离最小的边
            end = e.adjVertex;      //边指向的顶点的下标
            
            if(visited[end]==1)     //已访问,就跳过
                continue;
            
            visited[end]=1;
            
            System.out.println(AG.adjList[end].name+" ("+e.value+")");  //输出刚刚加入集合的顶点及原来其与集合的最小边权值
            
            v = AG.adjList[end];
            e = v.firstArc;
            while(e!=null){
                if(visited[e.adjVertex]==0 && dis[e.adjVertex]>e.value){    //对于集合刚刚加入了一个顶点,遍历它相连的顶点(不在集合的那些)。
                                                                            //因为与这个顶点不相连的其他顶点,与集合的最小距离也不会变!
                    dis[e.adjVertex] = e.value;
                    queue.add(e);
                }
                e = e.nextArc;
            }
        }
    }

    
}


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


然后使用邻接矩阵的数据结构实现:

class Vertex {
    String name;        //顶点信息
}
    
class MGraph {
    int n;                //图的顶点数n
    int e;                //图的边数e
    int[] vex ;    //顶点数组
    int[][] edges ;    //邻接矩阵
    
    
    public void prim(MGraph MG,int[] visited,int[] dis){
        int n = MG.n;
        for(int i=1;i<=MG.n;i++)
            dis[i] = 10000;
        
        visited[1] = 1;
        System.out.println(1);
        
        for(int i=1;i<=n;i++){
            if(MG.edges[1][i]>0){
                dis[i] = MG.edges[1][i];
            }
        }
        
        int pos = 1;
        int min;
        for(int i=2;i<=n;i++){
            min = 1000;
            for(int j=1;j<=n;j++){
                if(visited[j]==0 && min>dis[j])
                {min = dis[j];pos = j;}
            }
            visited[pos] = 1;
            System.out.println(pos+" ("+dis[pos]+")");
            for(int j=1;j<=n;j++){
                if(MG.edges[pos][j]>0){
                    dis[j] = MG.edges[pos][j];
                }
            }
            
        }
    }

}

 

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值