1. 程式人生 > >圖的表示和遍歷

圖的表示和遍歷

來自《圖解資料結構---使用Java》

圖的表示常見到的有:

  • 相鄰矩陣法
  • 相鄰表法

(1)相鄰矩陣法 

某個點arr[x][y]值為1則表示對應頂點有邊存在,為0則表示對應頂點無邊存在。 

無向圖(矩陣對稱)   有向圖(矩陣不對稱)

package com.duoduo.day316;
/*無向圖*/
public class Graph1 {

	public static void main(String [] args) {
		int[][] arr=new int[6][6];   //5個頂點 長度6
		int i,j,temp1,temp2;
		int [][] data= {{1,2},{2,1},{1,5},{5,1},{2,3},{3,2},{2,4},{4,2},{3,4},{4,3},{3,5},{5,3},{4,5},{5,4}};
		
		//初始化相鄰矩陣
		for(i=0;i<6;i++) {
			for(j=0;j<6;j++) {
				arr[i][j]=0;
			}
		}
		
		
		//讀取data矩陣資訊 並將邊資訊填入arr矩陣
		for(int k=0;k<13;k++) {      //讀取data
				temp1=data[k][0];
				temp2=data[k][1];
				arr[temp1][temp2]=1;
		}
		
		//輸出矩陣
		for(i=1;i<6;i++) {
			for(j=1;j<6;j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	}
}
	


package com.duoduo.day316;
/**
 * 有向圖
 * @author 多多
 *
 */
public class Graph {
	public static void main(String [ ] args) {
		int [][] arr=new int[5][5];   //4個頂點  1,2,3,4   宣告矩陣
		int i,j,temp1,temp2;
		int[][] data= {{1,2},{2,1},{2,3},{2,4},{4,3}};  //圖形各邊的起始點和終點值
		
		//初始化相鄰矩陣為0
		for( i=0;i<5;i++) {
			for( j=0;j<5;j++) {
				arr[i][j]=0;
			}
		}
		
		//讀取邊資訊  填入arr矩陣 
		for(i=0;i<5;i++) {
			temp1=data[i][0];   //起始頂點
			temp2=data[i][1];   //終止頂點
			arr[temp1][temp2]=1; //有邊的點填入1
		}
		
		//列印矩陣
		for(i=1;i<5;i++) {
			for(j=1;j<5;j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	
	}
}

(2)相鄰表法 

圖形A有n個頂點,則用n個表(連結串列)來表示,每個頂點後面接著的表節點元素表示該頂點到該元素存在邊,每個表的最後一個元素為null。


package com.duoduo.day316;
import com.duoduo.day316.Node;
/**
 * 相鄰表法
 * 每一個頂點使用一個表
 * @author 多多
 *
 */
public class GraphLink {
	public  Node first;  //頭節點
	public Node last;   //尾節點
	
	/*判斷連結串列是否為空*/
	public  boolean isEmpty() {
		return first==null;
	}
	
	/*列印連結串列節點*/
	public void print() {
		Node current=first;
		while(current!=null) {
			System.out.print("["+current.data+"]");
			current=current.next;
		}
	System.out.println();
	}
	
	/*插入連結串列節點*/
	public void insert(int newData) {
		Node newNode=new Node(newData);   //新建節點
		//判斷連結串列是否為空
		if(isEmpty()) {
			first=newNode;
			last=newNode;
		}else {
			last.next=newNode;
			last=newNode;
		}
	}
		
	
	public static void main(String [] args) {
		int[][] Data= {{1,2},{2,1},{1,5},{5,1},{2,3},{3,2},{2,4},{4,2},{3,4},{4,3},{3,5},{5,3},{4,5},{5,4}};
		int newData;                            //插入的新節點
		int i,j;
		System.out.println("圖形的鄰接表內容:");
		GraphLink [] head=new GraphLink[6];     //5個頂點  長度為6     儲存頂點連結串列的陣列
		for(i=1;i<6;i++) {                     //每個頂點建立一個單鏈表
			head[i]=new GraphLink();          
			System.out.print("頂點"+i+"-->"); 
			for(j=0;j<14;j++) {
				if(Data[j][0]==i) {             //若起始頂點為i時 
					newData=Data[j][1];         //則將終止節點視為新節點---插入至以i為起始頂點的單鏈表中
					head[i].insert(newData);
				}
			}
			head[i].print();
		}
	}
}




相關推薦

表示

來自《圖解資料結構---使用Java》圖的表示常見到的有:相鄰矩陣法相鄰表法(1)相鄰矩陣法 某個點arr[x][y]值為1則表示對應頂點有邊存在,為0則表示對應頂點無邊存在。 無向圖(矩陣對稱)   有向圖(矩陣不對稱)package com.duoduo.day316;

的廣度深度

初始化 -- fin num 方法 技術分享 else 全部 nts /* 圖的遍歷方法主要有兩種:一種是深度優先遍歷。一種是廣度優先遍歷。圖的深度優先遍歷類同於樹的先根遍歷。圖的廣度遍歷類同樹的層次遍歷 一:連通圖的深度優先遍歷算法 圖的深度優先遍歷算法是遍歷

JS實現的建立

圖分為無向圖和有向圖  圖的儲存結構有鄰接矩陣、鄰接表、十字連結串列、鄰接多重表這四種,最常用的是前兩種 本篇主要是利用鄰接矩陣實現無向圖的建立和遍歷(深度優先、廣度優先),深度優先其實就是二叉樹裡的前序遍歷          利用鄰接

整形的深度廣度

比較簡單的實現,圖採用鄰接矩陣的儲存方式,且沒有加上覆制建構函式和過載運算子。 #include <iostream> #include<stdexcept> #include<stdio.h> using namespace std; struc

表示

1. 圖的表示 1)臨接矩陣 使用二維陣列arr[N][N]表示一個圖。 a. N 為圖的頂點個數,矩陣的對角線全為0。 b. 兩個頂點連通的話,矩陣的值為1 c. 某一行的和表示該頂點的出度。某一列的和表示該頂點的入度 d. 有權值的圖,矩陣元素不再是0,1表示是否連通,而是把元素值表示為權值。

的深度廣度

理論部分 圖的深度遍歷和廣度遍歷都不算很難像極了二叉樹的前序遍歷和層序遍歷,如下面的圖,可以用右邊的鄰接矩陣進行表示,假設以頂點0開始對整幅圖進行遍歷的話,兩種遍歷方式的思想如下: 1. 深度優先遍歷(depthFirstSearch—DFS) 由初始頂點開始,沿著一條道一直走,

資料結構作業14—的概念 儲存結構

2-1若無向圖G =(V,E)中含7個頂點,要保證圖G在任何情況下都是連通的,則需要的邊數最少是: (3分) A.16 B.21 C.15 D.6 作者: DS課程組 單位: 浙江大學 2-2對於有向圖,其鄰接矩陣表示比鄰接表

資料結構作業14—的概念 儲存結構(判斷題)

1-1用鄰接矩陣法儲存圖,佔用的儲存空間數只與圖中結點個數有關,而與邊數無關。 (1分) T F 作者: DS課程組 單位: 浙江大學 1-2用鄰接表法儲存圖,佔用的儲存空間數只與圖中結點個數有關,而與邊數無關。 (1分) T

| 兩種方式:深度優先搜尋(DFS、深搜)廣度優先搜尋(BFS、廣搜)

前邊介紹了有關圖的 4 種儲存方式,本節介紹如何對儲存的圖中的頂點進行遍歷。常用的遍歷方式有兩種:深度優先搜尋和廣度優先搜尋。 深度優先搜尋(簡稱“深搜”或DFS) 圖 1 無向圖 深度優先搜尋的過程類似於樹的先序遍歷,首先從例

ARCEngine中右鍵層以層名欄位名

private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) { esri

森林表示

雙親表示法(順序儲存結構) 用一組連續的儲存空間來儲存樹的結點,同時在每個結點中附加一個指示器(整數域) ,用以指示雙親結點的位置(下標值) 。陣列元素及陣列的型別定義如下: #define MAX_SIZE 100 typedef s

的儲存

圖的儲存 圖的儲存一般有兩種方式:鄰接矩陣和鄰接表 鄰接矩陣 設圖G(V,E)的頂點標號為0,1,……n-1,則令二維陣列G[n][n]的兩維分別表示圖的頂點標號。 即如果G[i][j]等於1,指頂點i和頂點j之間有邊,如果G[i][j]等於0,指頂

的深度-鄰接連結串列表示

#include<stdio.h> #include<malloc.h> #define N 1005 typedef struct Link{ int data; str

的鄰接表表示

圖也可以用鄰接表表示。各個結點中存放了結點的資訊,並且由一個指標變數,指向第一條邊,第一條變又指向第二條邊,以此類推。圖的鄰接表的程式碼如下: /********************************/ /******圖的鄰接表的建立及遍歷****/ #inclu

的儲存C++實現

最近在做一些OJ題目時,感覺自己圖的應用還不夠熟練。所以又翻書看別人的部落格複習了一下,現把圖的常用內容總結如下: 圖的常用儲存方法有:鄰接矩陣和鄰接表 遍歷方法有:按深度遍歷(DFS),按廣度遍歷(BFS) 下面的程式碼都是C++寫的,用了一些STL庫的容器:

樹的創建

樹#include <stdio.h>#include <stdlib.h>struct node{ char data; struct node* left; struct node* right;};void preorder(struct node* root)

數據結構與算法第10周作業——二叉樹的創建算法

技術分享 truct order traverse eof 結構 後序遍歷 lib void 一、二叉樹的創建算法(遞歸方式) 二、二叉樹的先序、中序和後序遍歷算法 #include<stdio.h>#include<stdlib.h>typedef

數據結構-第10周作業(二叉樹的創建算法)

樹的創建 創建 -1 數據結構 二叉 分享 com jpg 遍歷算法 數據結構-第10周作業(二叉樹的創建和遍歷算法)

數據結構學習筆記(五) 樹的創建

一個 後序遍歷 for -1 堆棧 nor ext cnblogs 復制 創建(先序創建和根據先序和中序進行創建)和遍歷(先序遍歷、中序遍歷、後序遍歷、非遞歸堆棧遍歷、層次遍歷):    package tree; public class XianCreateTree

Jsoup解析一個HTML文檔(二)

spl nodes gif .org code htm ips method spa 關於Eclipse編輯器匯總console中字體調整: 1,下載jsoup的jar包:http://jsoup.org/download 2, jsoup英文的開發手冊:http: