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

Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解

 更新時(shí)間:2021年11月30日 16:50:34   作者:    
圖的領(lǐng)接矩陣存儲(chǔ)方式是用兩個(gè)數(shù)組來表示圖。一個(gè)一位數(shù)組存儲(chǔ)圖中頂點(diǎn)信息,一個(gè)二維數(shù)組存儲(chǔ)圖中的邊或弧的信息。本文將為大家重點(diǎn)介紹一下數(shù)據(jù)結(jié)構(gòu)中的圖的鄰接矩陣,快來跟隨小編一起學(xué)習(xí)吧

1.圖的領(lǐng)接矩陣(Adjacency Matrix)存儲(chǔ)結(jié)構(gòu)

圖的領(lǐng)接矩陣(Adjacency Matrix)存儲(chǔ)方式是用兩個(gè)數(shù)組來表示圖。一個(gè)一位數(shù)組存儲(chǔ)圖中頂點(diǎn)信息,一個(gè)二維數(shù)組(稱為領(lǐng)接矩陣)存儲(chǔ)圖中的邊或弧的信息。

舉例

無向圖

無向圖的領(lǐng)接矩陣的第i行或第i列的非零元素個(gè)數(shù)正好是第i個(gè)頂點(diǎn)的度。

有向圖

有向圖的領(lǐng)接矩陣的第i行的非零元素個(gè)數(shù)正好是第i個(gè)頂點(diǎn)的出度,第i列的非零元素個(gè)數(shù)正好是第i個(gè)頂點(diǎn)的入度。

帶權(quán)值的網(wǎng)圖

2.圖的接口類

3.圖的類型,用枚舉類表示

public enum GraphKind {
    UDG,DG,UDN,DN;//無向圖、有向圖、無向網(wǎng)、有向網(wǎng)
}

4.圖的領(lǐng)接矩陣描述

對(duì)于一個(gè)具有n個(gè)頂點(diǎn)的圖G,可以將圖G的領(lǐng)接矩陣存儲(chǔ)在一個(gè)二維數(shù)組中.

package Graph;
/*
    圖的領(lǐng)接矩陣描述類
 */
import java.util.Scanner;
 
public class MyGraph implements IGraph {
    public final static int INFINITY = Integer.MAX_VALUE;
    private GraphKind kind;             //圖的標(biāo)志
    private int vexNum, arcNum;          //圖當(dāng)前頂點(diǎn)和邊數(shù)
    private Object[] vexs;              //頂點(diǎn)
    private int[][] arcs;               //鄰接矩陣
 
    public MyGraph() {                  //空參構(gòu)造
        this(null, 0, 0, null, null);
    }
 
    public MyGraph(GraphKind kind, int vexNum, int arcNum, Object[] vexs, int[][] arcs) {   // 實(shí)參構(gòu)造
        this.kind = kind;
        this.vexNum = vexNum;
        this.arcNum = arcNum;
        this.vexs = vexs;
        this.arcs = arcs;
    }
 
    @Override
    public void createGraph() {               //創(chuàng)建新圖
        Scanner sc = new Scanner(System.in);
        System.out.println("請(qǐng)輸入圖的類型:");
        GraphKind kind = GraphKind.valueOf(sc.next());
        switch (kind) {
            case UDG:
                createUDG();
                return;
            case DG:
                createDG();
                return;
            case UDN:
                createUDG();
                return;
            case DN:
                createDN();
                return;
 
        }
    }
 
    private void createUDG() {       //創(chuàng)建無向圖
        Scanner sc = new Scanner(System.in);
        System.out.println("請(qǐng)輸入圖的頂點(diǎn)數(shù)、圖的邊數(shù):");
        vexNum = sc.nextInt();
        arcNum = sc.nextInt();
        vexs = new Object[vexNum];
        System.out.println("請(qǐng)分別輸入圖的各個(gè)頂點(diǎn)");
        for (int v = 0; v < vexNum; v++)                //構(gòu)造頂點(diǎn)函數(shù)
            vexs[v] = sc.next();
        arcs = new int[vexNum][vexNum];
        for (int v = 0; v < vexNum; v++)
            for (int u = 0; u < vexNum; u++)
                arcs[v][u] = INFINITY;              //初始化領(lǐng)接矩陣
        System.out.println("請(qǐng)輸入各個(gè)邊的兩個(gè)頂點(diǎn)及其權(quán)值:");
        for (int k = 0; k < arcNum; k++) {
            int v = locateVex(sc.next());
            int u = locateVex(sc.next());
            arcs[v][u] = arcs[v][u] = sc.nextInt();
        }
    }
    private void createDG() {       //創(chuàng)建有向圖
    }
    ;
 
    private void createUDN() {       //創(chuàng)建無向網(wǎng)
 
    }
    private void createDN() {           //創(chuàng)建有向網(wǎng)
        Scanner sc = new Scanner(System.in);
        System.out.println("請(qǐng)輸入圖的頂點(diǎn)數(shù)、圖的邊數(shù):");
        vexNum = sc.nextInt();
        arcNum = sc.nextInt();
        vexs = new Object[vexNum];
        System.out.println("請(qǐng)分別輸入圖的各個(gè)頂點(diǎn)");
        for (int v = 0; v < vexNum; v++)                //構(gòu)造頂點(diǎn)函數(shù)
            vexs[v] = sc.next();
        arcs = new int[vexNum][vexNum];
        for (int v = 0; v < vexNum; v++)
            for (int u = 0; u < vexNum; u++)
                arcs[v][u] = INFINITY;              //初始化領(lǐng)接矩陣
        System.out.println("請(qǐng)輸入各個(gè)邊的兩個(gè)頂點(diǎn)及其權(quán)值:");
        for (int k = 0; k < arcNum; k++) {
            int v = locateVex(sc.next());
            int u = locateVex(sc.next());
            arcs[v][u] = sc.nextInt();
        }
    }
    @Override
    public int getVexNum() {
        return vexNum;   //返回頂點(diǎn)數(shù)
    }
 
    @Override
    public int getArcNum() {
        return arcNum;      //返回邊數(shù)
    }
 
    @Override              //返回v的第一個(gè)領(lǐng)接點(diǎn),若v沒有領(lǐng)接點(diǎn)返回-1;
    public Object getVex(int v) throws Exception {
        if (v < 0 && v >= vexNum)
            throw new Exception("第" + v + "個(gè)頂點(diǎn)不存在!");
        return vexs[v];
          <0v<vexNum
    }
 
    @Override
    public int locateVex(Object vex) {          //頂點(diǎn)定位法
 
        for (int v = 0; v < vexNum; v++)
            if (vexs[v].equals(vex))
                return v;
        return 0;
    }
 
    @Override                            
    public int firstAdjVex(int v) throws Exception {   //查找第一個(gè)領(lǐng)接點(diǎn)
        if (v < 0 && v >= vexNum)
            throw new Exception("第" + v + "個(gè)頂點(diǎn)不存在!");
        for (int j = 0; j < vexNum; j++)
            if (arcs[v][j] != 0 && arcs[v][j] < INFINITY)
                return j;
                return -1;
    }
 
    
    @Override
    public int nextAdjvex(int v, int w) {         //查找下一個(gè)領(lǐng)接點(diǎn)
        return 0;
    }
    public GraphKind getKind(){                   //返回圖標(biāo)類型
        return kind;
    }
 
  
    public int[][] getArcs() {              //返回鄰接矩陣的值
        return arcs;
    }
 
                                            //返回頂點(diǎn)
    public Object[] getVexs() {
        return vexs;
    }
}

測(cè)試類

    public static void main(String[] args) throws Exception {
        MyGraph M=new MyGraph();                                //創(chuàng)建圖空間
        M.createGraph();
        System.out.println("創(chuàng)建無向網(wǎng)的頂點(diǎn)個(gè)數(shù)為:"+M.getVexNum());
        System.out.println("創(chuàng)建無向網(wǎng)的邊個(gè)數(shù)為:"+M.getArcNum());
        System.out.println("請(qǐng)輸入要查找頂點(diǎn)的值:");
        Scanner sc=new Scanner(System.in);                  
        Object top=sc.next();
        System.out.println("要查找頂點(diǎn)"+top+"的值為:"+ M.locateVex(top));
        System.out.println("請(qǐng)輸入要查找頂點(diǎn)的索引:");
        int x= sc.nextInt();
        System.out.println("要查找位置"+x+"處的頂點(diǎn)值為:"+M.getVex(x) );
        System.out.println("請(qǐng)輸入鄰接點(diǎn)的頂點(diǎn)的位置:");
        int n= sc.nextInt();
        System.out.println("要查找位置"+n+"處的頂點(diǎn)值為:"+M.firstAdjVex(n) );
    }
}

結(jié)果

以上就是Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解的詳細(xì)內(nèi)容,更多關(guān)于Java數(shù)據(jù)結(jié)構(gòu)資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 單例模式詳細(xì)解釋

    Java 單例模式詳細(xì)解釋

    這篇文章主要給大家介紹了關(guān)于Java中四種單例模式的相關(guān)資料,其中包括餓漢式、懶漢式、懶漢式(雙重鎖)及內(nèi)部類等四種,分別給出了詳細(xì)的示例代碼和介紹,需要的朋友們下面來一起看看吧。
    2021-11-11
  • java并發(fā)編程專題(三)----詳解線程的同步

    java并發(fā)編程專題(三)----詳解線程的同步

    這篇文章主要介紹了JAVA并發(fā)編程 線程同步的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java并發(fā)編程之Volatile變量詳解分析

    Java并發(fā)編程之Volatile變量詳解分析

    Volatile關(guān)鍵字是Java提供的一種輕量級(jí)的同步機(jī)制,本篇文章深入淺出的講講Java并發(fā)編程的Volatile,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Spring的兩種事務(wù)管理機(jī)制的基本概念和demo示例

    Spring的兩種事務(wù)管理機(jī)制的基本概念和demo示例

    Spring事務(wù)包括聲明式事務(wù)管理和注解式事務(wù)管理,我們通過概念和小demo的形式一步一步地來一起學(xué)習(xí)這個(gè)知識(shí)點(diǎn),需要的朋友可以參考下
    2023-07-07
  • 詳解Java中綴表達(dá)式的實(shí)現(xiàn)

    詳解Java中綴表達(dá)式的實(shí)現(xiàn)

    中綴表達(dá)式是一個(gè)通用的算術(shù)或邏輯公式表示方法。,中綴表達(dá)式不容易被計(jì)算機(jī)解析,但仍被許多程序語(yǔ)言使用,因?yàn)樗先藗兊钠毡橛梅ā1疚慕榻B了實(shí)現(xiàn)中綴表達(dá)式的方法,需要的可以參考一下
    2022-07-07
  • java springmvc 注冊(cè)中央調(diào)度器代碼解析

    java springmvc 注冊(cè)中央調(diào)度器代碼解析

    這篇文章主要介紹了java springmvc 注冊(cè)中央調(diào)度器代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 一文教你學(xué)會(huì)搭建SpringBoot分布式項(xiàng)目

    一文教你學(xué)會(huì)搭建SpringBoot分布式項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了搭建SpringBoot分布式項(xiàng)目的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 阿里云部署SpringBoot項(xiàng)目啟動(dòng)后被殺進(jìn)程的問題解析

    阿里云部署SpringBoot項(xiàng)目啟動(dòng)后被殺進(jìn)程的問題解析

    這篇文章主要介紹了阿里云部署SpringBoot項(xiàng)目啟動(dòng)后被殺進(jìn)程的問題,本文給大家分享問題原因所在及解決步驟,需要的朋友可以參考下
    2023-09-09
  • Spring成員對(duì)象注入的三種方式詳解

    Spring成員對(duì)象注入的三種方式詳解

    這篇文章主要為大家詳細(xì)介紹了Spring成員對(duì)象注入的三種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java9新特性Stream流API優(yōu)化與增強(qiáng)

    Java9新特性Stream流API優(yōu)化與增強(qiáng)

    這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2022-03-03

最新評(píng)論

同德县| 沂南县| 湖北省| 龙岩市| 顺平县| 云和县| 临洮县| 荥经县| 平凉市| 仁怀市| 饶阳县| SHOW| 彰化县| 土默特左旗| 龙井市| 德阳市| 渭南市| 汉寿县| 于都县| 东港市| 长乐市| 邹城市| 大城县| 台南市| 修武县| 新乐市| 大埔县| 青田县| 错那县| 丘北县| 腾冲县| 兴山县| 大洼县| 马尔康县| 南雄市| 二连浩特市| 原平市| 丹巴县| 丹阳市| 聊城市| 桂林市|