java Prim算法

来源:互联网 发布:西安市行知中学好不好 编辑:程序博客网 时间:2024/06/11 16:44

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

//弧的节点结构类型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
原创粉丝点击