【Java】邊集轉化為鄰接矩陣

來源:互聯網
上載者:User

標籤:java   資料結構   邊集   圖論   鄰接矩陣   

圖的邊集是可以轉化為鄰接矩陣的。

鄰接矩陣的定義如下:

鄰接矩陣(Adjacency Matrix):是表示頂點之間相鄰關係的矩陣。設G=(V,E)是一個圖,其中V={v1,v2,…,vn}。G的鄰接矩陣是一個具有下列性質的n階方陣:
①對無向圖而言,鄰接矩陣一定是對稱的,而且對角線一定為零(在此僅討論無向簡單圖),有向圖則不一定如此。
②在無向圖中,任一頂點i的度為第i列所有元素的和,在有向圖中頂點i的出度為第i行所有元素的和,而入度為第i列所有元素的和。
③用鄰接矩陣法表示圖共需要n^2個空間,由於無向圖的鄰接矩陣一定具有對稱關係,所以扣除對角線為零外,僅需要儲存上三角形或下三角形的資料即可,因此僅需要n(n-1)/2個空間。

邊集就是一個圖所有邊的集合。

這裡使用ArrayList edgeSet一個動態一維數組表示一個無向圖的邊集。定義:edgeSet中的順序為奇數與順序為偶數的共同表示一條邊。如下的測試案例:

ArrayList<Integer> edgeSet = new ArrayList<Integer>();edgeSet.add(1);edgeSet.add(2);edgeSet.add(1);edgeSet.add(3);edgeSet.add(2);edgeSet.add(3);edgeSet.add(2);edgeSet.add(4);

就是定義存在邊集{(1,2),(1,3),(2,3),(2,4)},現在的任務就是把它轉化為這個圖的鄰接矩陣:

1 23 4
1 0 11 0
2 1 01 1
3 1 10 0
4 0 10 0

這裡 橫軸1-4與數組組成1-4的矩陣元素座標,如果得到的結果是1,則表示,圖中存在此邊。比如矩陣元素中a[1][2]=1,則邊集一定存在邊(1,2),如果是0,則圖中必定不存在這條邊。比如a[1][4]=0,那麼在邊集中一定找不到(1,4)這條邊。

鄰接矩陣雖然看起來是二維數組,但是這裡還是一維數組表示,只是輸出的話以如下的方法輸出,那麼輸出的結果就是矩陣了。

//輸出以一維數組的表示的矩陣public static void printAdjacencyMatrix(int adjacencyMatrix[]) {//遍曆這個一維資料for (int i = 0; i < adjacencyMatrix.length; i++) {//每輸出一個元素則同時輸出一個定位字元System.out.print(adjacencyMatrix[i] + "\t");//如果遍曆的計數器i+1,剛好是矩陣長度的平方,的倍數,則輸出一個換行if (((i + 1) % Math.sqrt(adjacencyMatrix.length)) == 0) {System.out.println();}}System.out.println();}
此方法的關鍵是換行的輸出。比如這個的輸出矩陣,i從0開始遇到4,8,12,16則輸出一個換行,這個矩陣的長度是25,因此便有了如上的“如果遍曆的計數器i+1,剛好是矩陣長度的平方,的倍數,則輸出一個換行”:

0 1 2 3 4
1 0 11 0
2 1 01 1
3 1 10 0
4 0 10 0

要把邊集轉化成鄰接矩陣,首先要以如下的情況初始化鄰接矩陣,布置好橫軸、縱軸,當然,那個0隻是為了佔領那個鄰接矩陣a[0][0]這個沒有意義的位置。

0 1 2 3 4
1 0 00 0
2 0 00 0
3 0 00 0
4 0 00 0

此時應該先根據邊集求出點集。根據邊集求出點集在《【Java】為ArrayList去重》(點擊開啟連結)已經介紹過了,這裡不再贅述,就是一個邊集元素去重的過程。

由於鄰接矩陣式由一維數組表示的。因此縱軸的位置是 計數器i x 點集長度+1,比如上面的數組,點集就是{1,2,3,4},長度為4,縱軸1,2,3,4分別在一維數組的5,11,16,21這個位置,因此便有了如下的代碼:

System.out.println("初始化鄰接矩陣:");ArrayList<Integer> nodeSet = new ArrayList(new HashSet(edgeSet));int adjacencyMatrix[] = new int[(nodeSet.size() + 1)* (nodeSet.size() + 1)];for (int i = 0; i <= nodeSet.size(); i++) {if (i == 0) {adjacencyMatrix[i] = 0;} else {adjacencyMatrix[i] = nodeSet.get(i - 1);adjacencyMatrix[i * (nodeSet.size() + 1)] = nodeSet.get(i - 1);}}

接著,是最核心的一步,首先要遍曆點集,求出這個點的鄰接節點。點的鄰接節點根據這個點與邊集,如下方法求出:

//求點的鄰接節點public static ArrayList<Integer> neighbourNode(ArrayList<Integer> edgeSet,int node) {//設定一個動態數組ArrayList儲存此點的鄰接節點ArrayList<Integer> neighbourNode = new ArrayList<Integer>();//遍曆邊集,看那條邊擁有此點,那麼這條邊的另一點,就是此點的鄰接節點for (int i = 0; i < edgeSet.size(); i = i + 2) {if (node == edgeSet.get(i)) {neighbourNode.add(edgeSet.get(i + 1));}}for (int i = 1; i < edgeSet.size(); i = i + 2) {if (node == edgeSet.get(i)) {neighbourNode.add(edgeSet.get(i - 1));}}return neighbourNode;}

求出點的鄰接節點集之後,就開始遍曆這個點的鄰接節點集,更新鄰接矩陣中的元素。找出這點與其鄰接節點,組成的一個矩陣元素座標,把這個這個矩陣元素座標所對應的值從0改成1,對所有點求出其鄰接節點,之後再該上面的方法,更新鄰接矩陣,因此便有了如下的代碼:

System.out.println("最終的鄰接矩陣:");for (int i =1; i <= nodeSet.size(); i++) {ArrayList<Integer> neighbourNode=neighbourNode(edgeSet,adjacencyMatrix[i]);for(int j=0;j<neighbourNode.size(); j++){for(int k=0;k<=nodeSet.size();k++){if(neighbourNode.get(j)==adjacencyMatrix[k * (nodeSet.size()+1)]){adjacencyMatrix[(nodeSet.size()+1)*k+i]=1;}}}}printAdjacencyMatrix(adjacencyMatrix);

至此,邊集就最終轉化成鄰接矩陣了。全代碼如下:

import java.util.*;public class edgeSet_AdjacencyMatrix {//求點的鄰接節點public static ArrayList<Integer> neighbourNode(ArrayList<Integer> edgeSet,int node) {//設定一個動態數組ArrayList儲存此點的鄰接節點ArrayList<Integer> neighbourNode = new ArrayList<Integer>();//遍曆邊集,看那條邊擁有此點,那麼這條邊的另一點,就是此點的鄰接節點for (int i = 0; i < edgeSet.size(); i = i + 2) {if (node == edgeSet.get(i)) {neighbourNode.add(edgeSet.get(i + 1));}}for (int i = 1; i < edgeSet.size(); i = i + 2) {if (node == edgeSet.get(i)) {neighbourNode.add(edgeSet.get(i - 1));}}return neighbourNode;}//輸出以一維數組的表示的矩陣public static void printAdjacencyMatrix(int adjacencyMatrix[]) {//遍曆這個一維資料for (int i = 0; i < adjacencyMatrix.length; i++) {//每輸出一個元素則同時輸出一個定位字元System.out.print(adjacencyMatrix[i] + "\t");//如果遍曆的計數器i+1,剛好是矩陣長度的平方,的倍數,則輸出一個換行if (((i + 1) % Math.sqrt(adjacencyMatrix.length)) == 0) {System.out.println();}}System.out.println();}public static void edgeSet_AdjacencyMatrix(ArrayList<Integer> edgeSet) {System.out.println("初始化鄰接矩陣:");ArrayList<Integer> nodeSet = new ArrayList(new HashSet(edgeSet));int adjacencyMatrix[] = new int[(nodeSet.size() + 1)* (nodeSet.size() + 1)];for (int i = 0; i <= nodeSet.size(); i++) {if (i == 0) {adjacencyMatrix[i] = 0;} else {adjacencyMatrix[i] = nodeSet.get(i - 1);adjacencyMatrix[i * (nodeSet.size() + 1)] = nodeSet.get(i - 1);}}printAdjacencyMatrix(adjacencyMatrix);System.out.println("最終的鄰接矩陣:");for (int i =1; i <= nodeSet.size(); i++) {ArrayList<Integer> neighbourNode=neighbourNode(edgeSet,adjacencyMatrix[i]);for(int j=0;j<neighbourNode.size(); j++){for(int k=0;k<=nodeSet.size();k++){if(neighbourNode.get(j)==adjacencyMatrix[k * (nodeSet.size()+1)]){adjacencyMatrix[(nodeSet.size()+1)*k+i]=1;}}}}printAdjacencyMatrix(adjacencyMatrix);}public static void main(String[] args) {ArrayList<Integer> edgeSet = new ArrayList<Integer>();edgeSet.add(1);edgeSet.add(2);edgeSet.add(1);edgeSet.add(3);edgeSet.add(2);edgeSet.add(3);edgeSet.add(2);edgeSet.add(4);edgeSet_AdjacencyMatrix(edgeSet);}}

邊集{(1,2),(1,3),(2,3),(2,4)}的運行結果:


【Java】邊集轉化為鄰接矩陣

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.