最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java數(shù)據(jù)結(jié)構(gòu)之加權(quán)無向圖的設計實現(xiàn)

 更新時間:2022年11月03日 15:37:39   作者:JAVA旭陽  
加權(quán)無向圖是一種為每條邊關聯(lián)一個權(quán)重值或是成本的圖模型。這種圖能夠自然地表示許多應用。這篇文章主要介紹了加權(quán)無向圖的設計與實現(xiàn),感興趣的可以了解一下

前言

加權(quán)無向圖是一種為每條邊關聯(lián)一個權(quán)重值或是成本的圖模型。這種圖能夠自然地表示許多應用。在一副航空圖中,邊表示航線,權(quán)值則可以表示距離或是費用。在一副電路圖中,邊表示導線,權(quán)值則可能表示導線的長度即成本,或是信號通過這條先所需的時間。此時我們很容易就能想到,最小成本的問題,例如,從西安飛紐約,怎樣飛才能使時間成本最低或者是金錢成本最低?
在下圖中,從頂點0到頂點4有三條路徑,分別為0-2-3-4,0-2-4,0-5-3-4,那我們?nèi)绻ㄟ^那條路徑到達4頂點最好呢?此時就要考慮,那條路徑的成本最低。

邊的表示

加權(quán)無向圖中的邊我們就不能簡單的使用v-w兩個頂點表示了,而必須要給邊關聯(lián)一個權(quán)重值,因此我們可以使用對象來描述一條邊。

API設計

類名Edge implements Comparable
成員變量1.private final int v:頂點一2.private final int w:頂點二3.private final double weight:當前邊的權(quán)重
構(gòu)造方法Edge(int v,int w,double weight):通過頂點v和w,以及權(quán)重weight值構(gòu)造一個邊對象
成員方法1.public double weight():獲取邊的權(quán)重值2.public int either():獲取邊上的一個點3.public int other(int vertex)):獲取邊上除了頂點vertex外的另外一個頂點4.public int compareTo(Edge that):比較當前邊和參數(shù)that邊的權(quán)重,如果當前邊權(quán)重大,返回1,如果一樣大,返回0,如果當前權(quán)重小,返回-1

代碼實現(xiàn)

/**
 * 邊
 *
 * @author alvin
 * @date 2022/11/3
 * @since 1.0
 **/
public class Edge implements Comparable<Edge> {
    //頂點一
    private final int v;
    //頂點二
    private final int w;
    //當前邊的權(quán)重
    private final double weight;

    //通過頂點v和w,以及權(quán)重weight值構(gòu)造一個邊對象
    public Edge(int v, int w, double weight) {
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    //獲取邊的權(quán)重值
    public double weight() {
        return weight;
    }

    //獲取邊上的一個點
    public int either() {
        return v;
    }

    //獲取邊上除了頂點vertex外的另外一個頂點
    public int other(int vertex) {
        if (vertex == v) {
            return w;
        } else {
            return v;
        }
    }

    @Override
    public int compareTo(Edge that) {
        //使用一個遍歷記錄比較的結(jié)果
        int cmp;

        if (this.weight() > that.weight()) {
            //如果當前邊的權(quán)重值大,則讓cmp=1;
            cmp = 1;
        } else if (this.weight() < that.weight()) {
            //如果當前邊的權(quán)重值小,則讓cmp=-1;
            cmp = -1;
        } else {
            //如果當前邊的權(quán)重值和that邊的權(quán)重值一樣大,則讓cmp=0
            cmp = 0;
        }

        return cmp;
    }
}

圖的實現(xiàn)

之前我們已經(jīng)完成了無向圖,在無向圖的基礎上,我們只需要把邊的表示切換成Edge對象即可。

API設計

類名EdgeWeightedGraph
成員變量1.private final int V: 記錄頂點數(shù)量2.private int E: 記錄邊數(shù)量3.private Queue[] adj: 鄰接表
構(gòu)造方法EdgeWeightedGraph(int V):創(chuàng)建一個含有V個頂點的空加權(quán)無向圖
成員方法1.public int V():獲取圖中頂點的數(shù)量2.public int E():獲取圖中邊的數(shù)量3.public void addEdge(Edge e):向加權(quán)無向圖中添加一條邊e4.public Queue adj(int v):獲取和頂點v關聯(lián)的所有邊5.public Queue edges():獲取加權(quán)無向圖的所有邊

代碼實現(xiàn)

/**
 * 加權(quán)無向圖的實現(xiàn)
 *
 * @author alvin
 * @date 2022/11/3
 * @since 1.0
 **/
public class EdgeWeightedGraph {
    //頂點總數(shù)
    private final int V;
    //邊的總數(shù)
    private int E;
    //鄰接表
    private Queue<Edge>[] adj;

    //創(chuàng)建一個含有V個頂點的空加權(quán)無向圖
    public EdgeWeightedGraph(int V) {
        //初始化頂點數(shù)量
        this.V = V;
        //初始化邊的數(shù)量
        this.E = 0;
        //初始化鄰接表
        this.adj = new Queue[V];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new ArrayDeque<>();
        }

    }

    //獲取圖中頂點的數(shù)量
    public int V() {
        return V;
    }

    //獲取圖中邊的數(shù)量
    public int E() {
        return E;
    }


    //向加權(quán)無向圖中添加一條邊e
    public void addEdge(Edge e) {
        //需要讓邊e同時出現(xiàn)在e這個邊的兩個頂點的鄰接表中
        int v = e.either();
        int w = e.other(v);

        adj[v].add(e);
        adj[w].add(e);

        //邊的數(shù)量+1
        E++;
    }

    //獲取和頂點v關聯(lián)的所有邊
    public Queue<Edge> adj(int v) {
        return adj[v];
    }

    //獲取加權(quán)無向圖的所有邊
    public Queue<Edge> edges() {
        //創(chuàng)建一個隊列對象,存儲所有的邊
        Queue<Edge> allEdges = new ArrayDeque<>();

        //遍歷圖中的每一個頂點,找到該頂點的鄰接表,鄰接表中存儲了該頂點關聯(lián)的每一條邊
        //因為這是無向圖,所以同一條邊同時出現(xiàn)在了它關聯(lián)的兩個頂點的鄰接表中,需要讓一條邊只記錄一次;
        for (int v = 0; v < V; v++) {
            //遍歷v頂點的鄰接表,找到每一條和v關聯(lián)的邊
            for (Edge e : adj(v)) {
                if (e.other(v) < v) {
                    allEdges.add(e);
                }
            }
        }
        return allEdges;
    }
}

到此這篇關于Java數(shù)據(jù)結(jié)構(gòu)之加權(quán)無向圖的設計實現(xiàn)的文章就介紹到這了,更多相關Java加權(quán)無向圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Springboot吞吐量優(yōu)化解決方案

    基于Springboot吞吐量優(yōu)化解決方案

    這篇文章主要介紹了基于Springboot吞吐量優(yōu)化解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • springboot項目實現(xiàn)多數(shù)據(jù)源配置使用dynamic-datasource-spring-boot-starter的操作步驟

    springboot項目實現(xiàn)多數(shù)據(jù)源配置使用dynamic-datasource-spring-boot-starter

    這篇文章主要介紹了springboot項目實現(xiàn)多數(shù)據(jù)源配置使用dynamic-datasource-spring-boot-starter,本文分步驟結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • java 設計模型之單例模式詳解

    java 設計模型之單例模式詳解

    本文主要介紹了java 單例模式,單例對象(Singleton)是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在,希望能幫助有需要的同學
    2016-07-07
  • SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解

    SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解

    Spring對數(shù)據(jù)源的管理類似于策略模式,不懂策略模式也沒關系,其實就是有一個全局的鍵值對,類型是Map<String, DataSource>,當JDBC操作數(shù)據(jù)庫之時,會根據(jù)不同的key值選擇不同的數(shù)據(jù)源,本文介紹了SpringBoot配置動態(tài)數(shù)據(jù)源的方法,需要的朋友可以參考下
    2024-08-08
  • JAVA不使用線程池來處理的異步的方法詳解

    JAVA不使用線程池來處理的異步的方法詳解

    這篇文章主要介紹了JAVA不使用線程池來處理的異步的方法,在這個示例中,asyncTask方法創(chuàng)建了一個新的線程來執(zhí)行異步任務,這個新線程會立即開始執(zhí)行,而主線程則會繼續(xù)執(zhí)行后續(xù)的代碼,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Java實現(xiàn)整合文件上傳到FastDFS的方法詳細

    Java實現(xiàn)整合文件上傳到FastDFS的方法詳細

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),對文件進行管理,功能包括:文件存儲、文件同步、文件上傳、文件下載等,解決了大容量存儲和負載均衡的問題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下
    2022-02-02
  • SpringBoot臨時屬性設置方法

    SpringBoot臨時屬性設置方法

    這篇文章主要介紹了SpringBoot臨時屬性設置方法,SpringBoot工程可以基于java環(huán)境獨立進行jar文件啟動服務,文中給大家提到了命令行啟動常見問題以及解決方案,需要的朋友可以參考下
    2022-09-09
  • JavaEE中volatile、wait和notify詳解

    JavaEE中volatile、wait和notify詳解

    這篇文章主要給大家介紹了關于JavaEE中volatile、wait和notify的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • Java責任鏈設計模式實例分析

    Java責任鏈設計模式實例分析

    這篇文章主要介紹了Java責任鏈設計模式,結(jié)合實例形式詳細分析了Java責任鏈設計模式的原理與相關操作技巧,需要的朋友可以參考下
    2019-07-07
  • Spring-IOC容器-Bean管理-基于XML方式超詳解

    Spring-IOC容器-Bean管理-基于XML方式超詳解

    這篇文章主要介紹了Spring為IOC容器Bean的管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08

最新評論

墨竹工卡县| 延长县| 平潭县| 措勤县| 宁波市| 成都市| 中江县| 紫金县| 忻州市| 洛浦县| 彩票| 邹城市| 安顺市| 金昌市| 江华| 忻州市| 武山县| 乌苏市| 承德县| 炉霍县| 资溪县| 延庆县| 乐山市| 揭东县| 双桥区| 寿阳县| 射洪县| 宽甸| 石嘴山市| 文山县| 贵阳市| 三都| 高州市| 阜南县| 温宿县| 庐江县| 江安县| 山西省| 南丰县| 大关县| 安溪县|