1. 程式人生 > 其它 >資料結構——圖的鄰接矩陣建立(java版本)

資料結構——圖的鄰接矩陣建立(java版本)

鄰接矩陣的概念:

所謂鄰接矩陣,就是用兩個陣列來表示圖的相關資訊,其中用一個一維的頂點陣列來表示圖的頂點資訊,用一個二維的邊陣列來表示圖的邊或者弧資訊。

如下圖是一個無向圖的鄰接矩陣表示,兩個頂點之間若聯通則二維陣列對應位置為1,否則為0。

下圖是一個有向圖的鄰接矩陣表示。

下圖是一個帶權值的有向圖(又稱為有向網)的鄰接矩陣表示,兩個頂點之間若連通則二維陣列 對應位置為邊上的權值,否則為無窮大,並且二維矩陣的對角線為0(當然也可以設定為無窮大)

程式碼部分:

該程式碼用一個類去實現鄰接矩陣,其中類中含有一個一維頂點陣列和一個二維邊陣列欄位,並且 包含無向圖、有向圖、帶權值的無向圖(無向網)、帶權值的有向圖(有向網)的建立方法

public class MGraph01 {
    public int numNodes;      //圖的頂點數目
    public int numEdges;      //圖的邊數
    public Object[] vexs;     //一維頂點陣列
    public int[][] arcs;      //二維邊陣列
    public static final int INF = Integer.MAX_VALUE; //無窮大

    /**
     * 建立無向圖的鄰接矩陣
     */
    public void createUDG() {
        Scanner sc 
= null; try { sc = new Scanner(System.in); System.out.println("請輸入圖的頂點數、圖的邊數:"); numNodes = Integer.parseInt(sc.nextLine()); numEdges = Integer.parseInt(sc.nextLine()); vexs = new Object[numNodes]; //錄入頂點資訊 System.out.println("請輸入圖中的頂點:"); vexs
= sc.nextLine().split(" "); //錄入邊的資訊 arcs = new int[numNodes][numNodes]; for (int i = 0; i < numEdges; i++) { System.out.println("請輸入第" + (i + 1) + "條邊上的一個頂點:"); //locate方法用來定位某個頂點在陣列中的索引 int index1 = locate(sc.nextLine()); System.out.println("請輸入第" + (i + 1) + "條邊上的另一個頂點:"); int index2 = locate(sc.nextLine()); //無向圖是個對稱矩陣 arcs[index1][index2] = arcs[index2][index1] = 1; } } catch (Exception e) { e.printStackTrace(); } finally { sc.close(); } } /** * 建立有向圖的鄰接矩陣 */ public void createDG() { Scanner sc = null; try { sc = new Scanner(System.in); System.out.println("請輸入圖的頂點數、圖的邊數:"); numNodes = Integer.parseInt(sc.nextLine()); numEdges = Integer.parseInt(sc.nextLine()); vexs = new Object[numNodes]; //錄入頂點資訊 System.out.println("請輸入圖中的頂點:"); String str = sc.nextLine(); vexs = str.split(" "); //錄入邊的資訊 arcs = new int[numNodes][numNodes]; for (int i = 0; i < numEdges; i++) { System.out.println("請輸入第" + (i + 1) + "條弧上的弧尾:"); int index1 = locate(sc.nextLine()); System.out.println("請輸入第" + (i + 1) + "條弧上的弧頭:"); int index2 = locate(sc.nextLine()); arcs[index1][index2] = 1; } } catch (Exception e) { e.printStackTrace(); } finally { sc.close(); } } /** * 建立無向網的鄰接矩陣 */ public void createUDN() { Scanner sc = null; try { sc = new Scanner(System.in); System.out.println("請輸入圖的頂點數、圖的邊數:"); numNodes = Integer.parseInt(sc.nextLine()); numEdges = Integer.parseInt(sc.nextLine()); vexs = new Object[numNodes]; //錄入頂點資訊 System.out.println("請輸入圖中的頂點:"); String str = sc.nextLine(); vexs = str.split(" "); //矩陣初始化,有向網中 arcs = new int[numNodes][numNodes]; for (int i = 0; i < numNodes; i++) { for (int j = 0; j < numNodes; j++) { arcs[i][j] = INF; } } //錄入邊的資訊 for (int i = 0; i < numEdges; i++) { System.out.println("請輸入第" + (i + 1) + "條邊上的一個頂點:"); int index1 = locate(sc.nextLine()); System.out.println("請輸入第" + (i + 1) + "條邊上的另一個頂點:"); int index2 = locate(sc.nextLine()); System.out.println("請輸入第" + (i + 1) + "條邊上的權值:"); arcs[index1][index2] = arcs[index2][index1] = Integer.parseInt(sc.nextLine()); } } catch (Exception e) { e.printStackTrace(); } finally { sc.close(); } } /** * 建立有向網的鄰接矩陣 */ public void createDN() { Scanner sc = null; try { sc = new Scanner(System.in); System.out.println("請輸入圖的頂點數、圖的邊數:"); numNodes = Integer.parseInt(sc.nextLine()); numEdges = Integer.parseInt(sc.nextLine()); vexs = new Object[numNodes]; //錄入頂點資訊 System.out.println("請輸入圖中的頂點:"); String str = sc.nextLine(); vexs = str.split(" "); //錄入邊的資訊 arcs = new int[numNodes][numNodes]; for (int i = 0; i < numEdges; i++) { System.out.println("請輸入第" + (i + 1) + "條弧上的弧尾:"); int index1 = locate(sc.nextLine()); System.out.println("請輸入第" + (i + 1) + "條弧上的弧頭:"); int index2 = locate(sc.nextLine()); System.out.println("請輸入第" + (i + 1) + "條弧上的權值:"); arcs[index1][index2] = Integer.parseInt(sc.nextLine()); } } catch (Exception e) { e.printStackTrace(); } finally { sc.close(); } } /** * 通過頂點資訊來定位其在頂點陣列中的索引 * * @param s * @return */ public int locate(Object s) { for (int i = 0; i < vexs.length; i++) { if (s.equals(vexs[i])) { return i; } } return -1; } }