解析加权无向图(内含代码详解)

加权无向图

加权无向图是一种为每条边关联一个权重值或是成本的图模型。这种图能够自然地表示许多应用。
在一副航空图中,边表示航线,权值则可以表示距离或者费用。
在一副电路图中,边表示导线,权值则可能表示导线的长度即成本,或是信号通过这条边需要的时间。
此时我们很容易就能想到,最小成本的问题,例如,从西安飞纽约,怎样飞才能使时间成本最低或者是金钱成本最低?

在下图中,从顶点0到顶点4有3条路径,分别是0-2-3-4,0-2-4,0-5-3-4,那么我们如果要通过那条路径到达4顶点最好呢?此时就要考虑那条路径的成本最低。
如下图,假如边上的代表时间:则从0到达4中时间有长有短,如果找到最短的呢?
0-2-3-4:6
0-2-4:10
0-5-3-4:5
在这里插入图片描述
加权无向图边的表示
加权无向图中的边我们就不能简单的使用v-w两个顶点表示了,而必须要给边关联一个权重值,因此我们可以使用对象来描述一条边。
API设计:
在这里插入图片描述
代码实现:

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

    //通过顶点v和w,以及权重weight构造一个边对象
    public Edge(int v,int w,double weight){
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

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

    /**
     * 获取边上的一个点
     * @return
     */
    public int either(){
        return v;//也可以为w,如果为w的话,函数other(int vertex)中的if()条件也需要改变
    }

    /**
     * 获取除了顶点vertex外的另外一个顶点
     * @param vertex
     * @return
     */
    public int other(int vertex){
        if(vertex == v){
            return w;
        }else {
            return v;
        }
    }

    @Override
    public int compareTo(Edge that){
        //使用一个遍历记录比较的结果
        int cmp;
        if(this.weight() > that.weight()){
            //如果当前的权重值大,则让cmp = 1
            cmp = 1;
        }else if(this.weight() < that.weight()){
            //如果当前边的权重值小,则让cmp = -1;
            cmp = -1;
        }else {
            //如果当前边的权重值和that边的权重值一样大,则让cmp = 0
            cmp = 0;
        }
        return cmp;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43751200/article/details/105450988
今日推荐