Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解
1.圖的領(lǐng)接矩陣(Adjacency Matrix)存儲(chǔ)結(jié)構(gòu)
圖的領(lǐng)接矩陣(Adjacency Matrix)存儲(chǔ)方式是用兩個(gè)數(shù)組來(lái)表示圖。一個(gè)一位數(shù)組存儲(chǔ)圖中頂點(diǎn)信息,一個(gè)二維數(shù)組(稱為領(lǐng)接矩陣)存儲(chǔ)圖中的邊或弧的信息。
舉例
無(wú)向圖

無(wú)向圖的領(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ú)向圖、有向圖、無(wú)向網(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)建無(wú)向圖
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ú)向網(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沒(méi)有領(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ú)向網(wǎng)的頂點(diǎn)個(gè)數(shù)為:"+M.getVexNum());
System.out.println("創(chuàng)建無(wú)向網(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)文章
Spring的兩種事務(wù)管理機(jī)制的基本概念和demo示例
Spring事務(wù)包括聲明式事務(wù)管理和注解式事務(wù)管理,我們通過(guò)概念和小demo的形式一步一步地來(lái)一起學(xué)習(xí)這個(gè)知識(shí)點(diǎn),需要的朋友可以參考下2023-07-07
java springmvc 注冊(cè)中央調(diào)度器代碼解析
這篇文章主要介紹了java springmvc 注冊(cè)中央調(diào)度器代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
一文教你學(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)程的問(wèn)題解析
這篇文章主要介紹了阿里云部署SpringBoot項(xiàng)目啟動(dòng)后被殺進(jìn)程的問(wèn)題,本文給大家分享問(wèn)題原因所在及解決步驟,需要的朋友可以參考下2023-09-09
Java9新特性Stream流API優(yōu)化與增強(qiáng)
這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪2022-03-03

