Java实现图的最小生成树算法

Java实现图的最小生成树算法

最小生成树定义:在一个连通图上创建一棵树,使这棵树能遍历所以结点,且路径值最小,且树不能有环,这样的树叫最小生成树。

例如:
有以下连通图
在这里插入图片描述
生成的最小生成树就为所以的红色边
在这里插入图片描述

实现过程:
1、图的边类
成员说明:
①private EdgeNode edgeNode1:连接该条边的一个结点
②private EdgeNode edgeNode2:连接该条边的另一个结点
③private int weight:该边的权值(长度)

public class Edge {
    private EdgeNode edgeNode1;
    private EdgeNode edgeNode2;
    private int weight;

    public Edge(EdgeNode edgeNode1, EdgeNode edgeNode2, int weight) {
        this.edgeNode1 = edgeNode1;
        this.edgeNode2 = edgeNode2;
        this.weight = weight;
    }

    public EdgeNode getEdgeNode1() {
        return edgeNode1;
    }

    public void setEdgeNode1(EdgeNode edgeNode1) {
        this.edgeNode1 = edgeNode1;
    }

    public EdgeNode getEdgeNode2() {
        return edgeNode2;
    }

    public void setEdgeNode2(EdgeNode edgeNode2) {
        this.edgeNode2 = edgeNode2;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
}

2、结点类
成员说明:
private String nodeName:结点名称

public class EdgeNode {
    private String nodeName;

    public String getNodeName() {
        return nodeName;
    }

    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
    }

    public EdgeNode(String nodeName) {
        this.nodeName = nodeName;
    }
}

3、具体算法类

public class Solution {

   private   ArrayList<Edge> list=new ArrayList<>();
   private   HashMap<String,EdgeNode> nodeMap=new HashMap<>();

     //生成图
   public void createMGraph(String node1,String node2,int weight){
         EdgeNode edgeNode1 = nodeMap.get(node1);
         EdgeNode edgeNode2 = nodeMap.get(node2);
         if (edgeNode1==null) {
             edgeNode1 = new EdgeNode(node1);
             nodeMap.put(node1,edgeNode1);
         }
         if (edgeNode2==null){
             edgeNode2 = new EdgeNode(node2);
             nodeMap.put(node2,edgeNode2);
         }
         list.add(new Edge(edgeNode1,edgeNode2,weight));

     }

    public void miniTree(){
         String nodeName1, nodeName2;
         //用于存放最小生成树的边
         Map<String,String> map =new HashMap<>();
         sortList(list);
         for (int i = 0,j=1; i <list.size() ; i++) {
             nodeName1=find(map,list.get(i).getEdgeNode1().getNodeName());
             nodeName2=find(map,list.get(i).getEdgeNode2().getNodeName());
             if (!nodeName1.equals(nodeName2)){
                 map.put(nodeName1,nodeName2);
                 //得到路径
                 System.out.println("路径"+j++ +":"+"开始结点:"+list.get(i).getEdgeNode1().getNodeName()
                                   +";结束结点:"+list.get(i).getEdgeNode2().getNodeName()+";权值:"+list.get(i).getWeight());
             }
         }

     }
     //该方法用于判断两个结点连接后是否会形成环
     private String find(Map<String ,String > map,String nodeName){
         while (map.get(nodeName)!=null){
             nodeName=map.get(nodeName);
         }
         return nodeName;
     }

     //将边集合按权值排序
     private void sortList(ArrayList<Edge> list){
           Collections.sort(list, new Comparator<Edge>() {
               @Override
               public int compare(Edge o1, Edge o2) {
                   return o1.getWeight()-o2.getWeight();
               }
           });
     }
}

4、测试类
构造如下的图
在这里插入图片描述

public class Test {
    public static void main(String[] args) {

        Solution t=new Solution();
        //构造以上的例图
        t.createMGraph("V0","V1",10);
        t.createMGraph("V0","V5",11);
        t.createMGraph("V1","V2",18);
        t.createMGraph("V1","V8",12);
        t.createMGraph("V1","V6",16);
        t.createMGraph("V2","V8",8);
        t.createMGraph("V2","V3",22);
        t.createMGraph("V3","V8",21);
        t.createMGraph("V3","V6",24);
        t.createMGraph("V3","V7",16);
        t.createMGraph("V3","V4",20);
        t.createMGraph("V4","V7",7);
        t.createMGraph("V4","V5",26);
        t.createMGraph("V5","V6",17);
        t.createMGraph("V6","V7",19);

        t.miniTree();
    }
}

5、结果

路径1:开始结点:V4;结束结点:V7;权值:7
路径2:开始结点:V2;结束结点:V8;权值:8
路径3:开始结点:V0;结束结点:V1;权值:10
路径4:开始结点:V0;结束结点:V5;权值:11
路径5:开始结点:V1;结束结点:V8;权值:12
路径6:开始结点:V1;结束结点:V6;权值:16
路径7:开始结点:V3;结束结点:V7;权值:16
路径8:开始结点:V6;结束结点:V7;权值:19

即生成的最小生成树为:
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值