图的相关算法总结

1.最小生成树

Prim算法:基于顶点的一种贪心思路。从一个顶点开始,并且标记该顶点已被访问visited = 1,然后在与之有边的且未标记过的顶点中,选择权最小的那个顶底并标记,记录下该边的权。重复上面操作,(若有N个顶点)直到有N-1条边时,遍历完成。

public class Prim {
   
    final static int N = 10000;
    public static void main(String[] args) {
   
        char[] data = new char[]{
   'A','B','C','D','E','F','G'};
        int verx = data.length;

        int[][] weight = new int[][]{
   
                {
   N, 5, 7, N, N, N, 2},
                {
   5, N, N, 9, N, N, 3},
                {
   7, N, N, N, 8, N, N},
                {
   N, 9, N, N, N, 4, N},
                {
   N, N, 8, N, N, 5, 4},
                {
   N, N, N, 4, 5, N, 6},
                {
   2, 3, N, N, 4, 6, N}
        };
        Graph graph = new Graph(verx);
        MinTree minTree = new MinTree();
        minTree.createGraph(graph, verx, data, weight);
//        minTree.show(graph);
        minTree.prim(graph, 4);
    }

    static class MinTree {
   
        //创建邻接矩阵
        public void createGraph(Graph graph, int verx, char[] data, int[][] weight) {
   
            int i, j;
            for (i = 0; i < verx; i++) {
   
                graph.data[i] = data[i];
                for(j = 0; j < verx; j++){
   
                    graph.weight[i][j] = weight[i][j];
                }
            }
        }

        //显示图的方法
        public void show(Graph graph){
   
            for(int[] link : graph.weight){
   
                System.out.println(Arrays.toString(link));
            }
        }

        public void prim(Graph graph, int v){
   
            int[] visited = new int[graph.verx];
            visited[v] = 1;
            int h1 = -1;
            int h2 = -1;
            int min = N;
            for(int k = 1; k < graph.verx; k++){
   
                for (int i = 0; i < graph.verx; i++){
   
                    for(int j = 0; j < graph.verx; j++){
   
                        if(visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < min) {
   
                            min = graph.weight[i][j];
                            h1 = i;
                            h2 = j;
                        }
                    }
                }
                System.out.println("边<" + graph.data[h1] + "," + graph.data[h2] + "> 权值:" + min);
                visited[h2] = 1;
                min = N;
            }
        }
    }

    static class Graph {
   
        int verx; //节点个数
        char[] data; //存放节点数据
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值