加权无向图的实现

导读:本篇文章讲解 加权无向图的实现,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一.概述

加权无向图是一种为每条边关联一个权重值或成本的图模型。这种图能够自然地表示许多应用。
在一副航空图中,边表示航线,权值则可以表示距离或是费用。在一副电路图中,边表示导线,权值则可能表示导线的长度即成本,或是信号通过这条先所需的时间。此时我们很容易就能想到,最小成本的问题。

二.实现

加权无向图中的边我们就不能简单的使用v-w两个顶点表示了,而必须要给边关联一个权重值,因此我们可以使用对象来描述一条边。
在这里插入图片描述
在这里插入图片描述

加权边类:

//加权边对象
public class Edge implements Comparable<Edge>{
    private final int v;  //顶点v
    private final int w;  //顶点w
    private final double weight; //当前边顶点权重

    public Edge(int v, int w, double weight) { //初始化边类Edge
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    public double weight(){ //获取边的权重
        return weight;
    }

    public int either(){  //返回边上的顶点v
        return v;
    }

    public int other(int y) { //返回边上除了顶点传入顶点y的另外一个顶点
        if (y == v) {
            return w;
        } else {
            return v;
        }
    }

    @Override
    public int compareTo(Edge o) {
        int r = 0;
        //如果当前边权重值大于o,则让r=1;
        if(this.weight()>o.weight()){
            r=1;
        }else if(this.weight()<o.weight()){
            r=-1;
        }else if(this.weight()==o.weight()){
            r=0;
        }
        return r;
    }
}

加权无向图:
在这里插入图片描述

//加权无向图
class pathWeight{
    private int V;  //顶点个数
    private int E;  //边的个数
    private Queue<Edge>[] adj; //每个邻接表中存的都是Edge !而不是普通顶点了

    public pathWeight(int v) { //初始化
        this.V = v;
        this.E = 0;
        this.adj = new LinkedList[v];     

        for(int i=0;i<v;i++){
            adj[i]=new LinkedList<>();  //初始化adj数组的每一个元素 即顶点
        }
    }

    public int V(){
        return V;
    }

    public int E(){
        return E;
    }

    public void addEdge(Edge e){
    //无向图,让边出现在两个顶点的邻接表中!
        int v=e.either();//获取顶点v
        int w=e.other(v);//获取顶点w
        adj[v].add(e); //将e边添加到v的邻接表中
        adj[w].add(e); //将e边添加到w的邻接表中
        E++;
    }

    public Queue<Edge> adj(int v){ //返回v的邻接表,即v关联的所有边                 
        return adj[v];
    }

    public Queue<Edge> edgs(){ //获取所有边
       Queue<Edge> allEdges=new LinkedList<>();

        //遍历图中的每一个顶点,找到该顶点的邻接表,邻接表中存的是该顶点关联的每一条边
        //由于是无向图,同一条边出现在两个顶点的邻接表中,要避免重复
        //避免重复: 当边的一个顶点比另一个小时才添加,否则不添加!
        for(int v=0;v<V;v++){ //遍历每个顶点
            for (Edge k : adj[v]) { //遍历每个顶点的邻接表
                if(v>k.other(v)){  //比较v和另一个顶点w,满足条件则添加至allEdges
                    allEdges.add(k);
                }
            }
        }
        return allEdges;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89348.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!