java数据结构------图

public class GraphTest {

    public static void main(String[] args) {
        final int MAXVAL = 1000;
        Graph graph = new Graph(9);
        /*
        int[] a0 = new int[] {0,MAXVAL,MAXVAL,MAXVAL,6};
        int[] a1 = new int[] {9,0,3,MAXVAL,MAXVAL};
        int[] a2 = new int[] {2,MAXVAL,0,5,MAXVAL};
        int[] a3 = new int[] {MAXVAL,MAXVAL,MAXVAL,0,4};
        int[] a4 = new int[] {MAXVAL,MAXVAL,MAXVAL,MAXVAL,0};
        
        int[][] array = new int[5][];
        array[0] = a0;
        array[1] = a1;
        array[2] = a2;
        array[3] = a3;
        array[4] = a4;
        graph.setMatrix(array);
        */
        
        int[] a0 = new int[] {0,10,MAXVAL,MAXVAL,MAXVAL,11,MAXVAL,MAXVAL,MAXVAL};
        int[] a1 = new int[] {10,0,18,MAXVAL,MAXVAL,MAXVAL,16,MAXVAL,12};
        int[] a2 = new int[] {MAXVAL,MAXVAL,0,22,MAXVAL,MAXVAL,MAXVAL,MAXVAL,8};
        int[] a3 = new int[] {MAXVAL,MAXVAL,22,0,20,MAXVAL,MAXVAL,16,21};
        int[] a4 = new int[] {MAXVAL,MAXVAL,MAXVAL,20,0,26,MAXVAL,7,MAXVAL};
        int[] a5 = new int[] {11,MAXVAL,MAXVAL,MAXVAL,26,0,17,MAXVAL,MAXVAL};
        int[] a6 = new int[] {MAXVAL,16,MAXVAL,MAXVAL,MAXVAL,17,0,19,MAXVAL};
        int[] a7 = new int[] {MAXVAL,MAXVAL,MAXVAL,16,7,MAXVAL,19,0,MAXVAL};
        int[] a8 = new int[] {MAXVAL,12,8,21,MAXVAL,MAXVAL,MAXVAL,MAXVAL,0};
        
        int[][] array = new int[9][];
        array[0] = a0;
        array[1] = a1;
        array[2] = a2;
        array[3] = a3;
        array[4] = a4;
        array[5] = a5;
        array[6] = a6;
        array[7] = a7;
        array[8] = a8;
        
        graph.setMatrix(array);
        
        int degree = graph.getOutDegree(6);
        System.out.println("该节点的出度为:"+degree);
        int a = graph.getInDegree(6);
        System.out.println("该节点的入度为:"+a);
        int b = graph.getWeightByTwoNode(2,3);
        System.out.println("两个节点的濃值为:"+b);
        graph.depthFirstSearch();
        graph.primAlgorithm();
        
    }
}
class Graph {
    private static final int MAXVAL = 1000;
    
    private int vertexSize ;
    
    private int[] vertex;/**存储顶点的一维数组**/
    
    private int[][] matrix;/**存储濃值的二维数组**/
    
    private boolean[] isVisited;/**定义一个布尔类型的数组,用于判断图中的节点是忦被鿿历过**/
    
    public Graph(int vertexSize) {
        /**
         * 1:刿始化数濮的个数 2:刿始化一个存储顶点的一维数组 3:刿始化一个存储边的二维数组**/
        this.vertexSize = vertexSize;
        vertex = new int[vertexSize];
        for(int i=0;i<vertexSize;i++) {
            vertex[i] = i;
        }
        matrix = new int[vertexSize][vertexSize];
        
        isVisited = new boolean[vertexSize];
    }

    public void setMatrix(int i, int[] a0) {
        
    }

    public int getVertexSize() {
        return vertexSize;
    }

    public void setVertexSize(int vertexSize) {
        this.vertexSize = vertexSize;
    }

    public int[] getVertex() {
        return vertex;
    }

    public void setVertex(int[] vertex) {
        this.vertex = vertex;
    }

    public void setMatrix(int[][] matrix) {
        this.matrix = matrix;
    }

    public int[][] getMatrix() {
        return matrix;
    }

    /**
     * 计算图中柿个节点的出度**/
    public int getOutDegree(int index) {
        if(index < 0) {
            return -1;
        }
        int degree = 0;
        for(int i=0;i<matrix[index].length;i++) {
            int weight = matrix[index][i];
            if(weight != 0 && weight != MAXVAL) {
                degree++;
            }
        }
        return degree;
    }
    
    /**
     * 计算图中柿个节点的入度**/
    public int getInDegree(int index) {
        if(index < 0) {
            return -1;
        }
        int degree = 0;
        for(int i=0;i<matrix.length;i++) {
            int weight = matrix[i][index];
            if(weight != MAXVAL && weight != 0) {
                degree++;
            }
        }
        return degree;
    }
    
    /**
     * 计算两个节点的濃值**/
    public int getWeightByTwoNode(int index_1,int index_2) {
        if(matrix[index_1][index_2] == MAXVAL) {
            return -1;
        }else if(matrix[index_1][index_2] == 0) {
            return 0;
        }else {
            return matrix[index_1][index_2];
        }
    }
    
    /**
     * 获忖柿个节点的第一个邻接点**/
    public int getFirstNeiborhodeNode(int index) {
        if(index < 0) {
            return -1;
        }
        for(int i=0;i<matrix[index].length;i++) {
            if(matrix[index][i] > 0 && matrix[index][i] < MAXVAL) {
                return i;
            }
        }
        return -1;
    }
    
    /**
     * 获忖柿个节点的第一个邻接点的下一个邻接点。 v代表正在鿿历的节点,firstNode代表v的第一个邻接点**/
    public int getFirstNodeNext(int v,int firstNodeIndex) {
        if(v < 0 || firstNodeIndex < 0) {
            return -1;
        }
        for(int i=firstNodeIndex+1;i<matrix[v].length;i++) {
            if(matrix[v][i] > 0 && matrix[v][i] < MAXVAL) {
                return i;
            }
        }
        return -1;
    }
    
    /**
     * 图的深度优先鿿历  内部方法**/
    private void depthFirstSearch(int vertex) {
        isVisited[vertex] = true;
        int neiborNode = getFirstNeiborhodeNode(vertex);
        while(neiborNode != -1) {
            if(!isVisited[neiborNode]) {
                
                depthFirstSearch(neiborNode);
            }
            neiborNode = getFirstNodeNext(vertex,neiborNode);
        }
    }
    
    /**
     * 对外公开的深度优先鿿历算法**/
    public void depthFirstSearch() {
        isVisited = new boolean[vertexSize];
        for(int i=0;i<vertexSize;i++) {
            System.out.println("正在鿿历的节点:"+i);
            if(!isVisited[i]) {
                depthFirstSearch(i);
            }
        }
        isVisited = new boolean[vertexSize];
    }
    
    /**
     * 普里姆算法---图的最尿鿿历算法
     * 构造最尿生房树的规则:
     * 1.尽釿选忖濃值最尿的边,但是丿能构房回路
     * 2.最尿生房树的边数总和为n-1**/
    public void primAlgorithm() {
        /**存储最尿定点濃值的数组,为0表示该顶点已绿找到最尿濃值**/
        int[] minWeightCostArray = new int[vertexSize];
        //int[] weightValue = new int[vertexSize];/**存放顶点值**/
        int minWeight,minId,sum = 0;/**定义最尿濃值忘釿,最尿濃值id,最尿濃值总和**/
        /**存储的是二维矩阵中下标为0的那一行数濮**/
        for(int i=0;i<vertexSize;i++) {
            minWeightCostArray[i] = matrix[0][i];
        }
        /**刿始化忘釿,因为在上鿢的for循环中已绿鿿历了第一行数濮,所以在这里忪需覿鿿历8次忳忯**/
        for(int i=1;i<vertexSize;i++) {
            minWeight = MAXVAL;
            minId = 0;
            /**作用:找到毿一行中的最尿濃值,然忎将最尿濃值赋值给minWeight**/
            for(int j=0;j<vertexSize;j++) {
                if(minWeightCostArray[j] > 0 && minWeightCostArray[j] < minWeight) {
                    minWeight = minWeightCostArray[j];
                    minId = j;
                }
            }
            System.out.println("顶点: "+minId+"最尿濃值: "+minWeight);
            //System.out.print(minId+"-->");
            sum+=minWeight;
            minWeightCostArray[minId] = 0;
            for(int k=0;k<vertexSize;k++) {
                /**
                 * 将濃值最尿的索引行数濮 与 最尿濃值数组中的数濮进行比较,并且替濢**/
                if(minWeightCostArray[k] != 0 && matrix[minId][k] < minWeightCostArray[k]) {
                    minWeightCostArray[k] = matrix[minId][k];
                    //weightValue[k] = minId;
                }
            }
            
        }
        System.out.println("总和: "+sum);
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值