91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現圖的遍歷

發布時間:2023-05-06 09:09:58 來源:億速云 閱讀:127 作者:zzz 欄目:編程語言

本文小編為大家詳細介紹“Java怎么實現圖的遍歷”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java怎么實現圖的遍歷”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1.圖的遍歷

從圖中某一頂點出發訪問圖中其余頂點,且每個頂點僅被訪問一次

圖的遍歷有兩種深度優先遍歷DFS、廣度優先遍歷BFS

2.深度優先遍歷

深度優先遍歷以深度為優先進行遍歷,簡單來說就是每次走到底。類似于二叉樹的前序遍歷

思路:

1.以某一個頂點為起點進行深度優先遍歷,并標記該頂點已訪問

2.以該頂點為起點選取任意一條路徑一直遍歷到底,并標記訪問過的頂點

3.第2步遍歷到底后回退到上一個頂點,重復第2步

4.遍歷所有頂點結束

根據遍歷思路可知,這是一個遞歸的過程,其實DFS與回溯基本相同。

遍歷:

Java怎么實現圖的遍歷

以此圖為例進行深度優先遍歷

	static void dfs(int[][] graph,int idx,boolean[]visit) {
		int len = graph.length;
		//訪問過
	 if(visit[idx]) return;
	 //訪問該頂點
	 System.out.println("V"+idx);
	 //標志頂點
	 visit[idx] = true;
	 for(int i = 1;i < len;i++) {
	 //訪問該頂點相連的所有邊
		 if(graph[idx][i] == 1) {
	 //遞歸進行dfs遍歷
		 dfs(graph, i, visit);
		 }
	 }
			
	}

遍歷結果:

V1

V2

V3

V4

V5

V6

V7

V8

V9

創建圖的代碼:

public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		//頂點數 以1開始
		int n = scanner.nextInt();
		int[][] graph = new int[n+1][n+1];
		//邊數
		int m = scanner.nextInt();
		
		for(int i = 1;i <= m;i++) {
			int v1 = scanner.nextInt();
			int v2 = scanner.nextInt();
			graph[v1][v2] = 1;
			graph[v2][v1] = 1;
		}
		
		//標記數組 false表示未訪問過 
		boolean[] visit = new boolean[n+1];
		dfs(graph, 1, visit);
		
	}

3.利用DFS判斷有向圖是否存在環

思路:遍歷某一個頂點時,如果除了上一個頂點之外,還存在其他相連頂點被訪問過,則必然存在環

	//默認無環
   static boolean flag = false;
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		//頂點數 以1開始
		int n = scanner.nextInt();
		int[][] graph = new int[n+1][n+1];
		//邊數
		int m = scanner.nextInt();
		
		for(int i = 1;i <= m;i++) {
			int v1 = scanner.nextInt();
			int v2 = scanner.nextInt();
			graph[v1][v2] = 1;
			
		}
	 //標記數組 true為訪問過
		boolean[] visit = new boolean[n+1];
		dfs(graph, 1, visit,1);
		if(flag) 
			System.out.println("有環");
		
	}
	
	static void dfs(int[][] graph,int idx,boolean[]visit,int parent) {
		int len = graph.length;
	
	 System.out.println("V"+idx);
	 //標記頂點
	 visit[idx] = true;
	 for(int i = 1;i < len;i++) {
		 //訪問該頂點相連的所有邊
		 if(graph[idx][i] == 1) {
		 if( !visit[i] ) {
		 dfs(graph, i, visit,idx);
		 }
		 else if(idx != i) {
			 flag = true;
		 }
		 }
	 }
	
	 
	}

注意:是有向圖判斷是否存在環,無向圖判斷是否存在環無意義,因為任意兩個存在路徑的頂點都可以是環

4.廣度優先遍歷

廣度優先遍歷是以廣度(寬度)為優先進行遍歷。類似于二叉樹的層序遍歷

思路:

1.以某一個頂點為起點進行廣度優先遍歷,并標記該頂點已訪問

2.訪問所有與該頂點相連且未被訪問過的頂點,并標記訪問過的頂點

3.以第2步訪問所得頂點為起點重復1、2步驟

4.遍歷所有頂點結束

通過隊列來輔助遍歷,隊列出隊順序即是廣度優先遍歷結果

Java怎么實現圖的遍歷

遍歷

Java怎么實現圖的遍歷

以此圖為例,采用鄰接矩陣的方式創建圖,進行BFS遍歷

	static void bfs(int[][] graph) {		
		int len = graph.length;
		//標記數組 false表示未訪問過 
		boolean[] visit = new boolean[len];
		//輔助隊列
		Queue<Integer> queue = new LinkedList<>();
		
		queue.offer(1);
		visit[1] = true;
		
		while(!queue.isEmpty()) {
			int num = queue.poll();
			System.out.println("V"+num);
					
			//遍歷該頂點所有相連頂點
			for(int i = 1;i < len;i++) {
				//相連并且沒有被訪問過
				if(graph[num][i] == 1 && !visit[i]) {
					queue.offer(i);
					visit[i] = true;				
				}
			}
		}	
	}

遍歷結果:

V1

V2

V6

V3

V7

V9

V5

V4

V8

創建圖的代碼

public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		//頂點數 以1開始
		int n = scanner.nextInt();
		int[][] graph = new int[n+1][n+1];
		//邊數
		int m = scanner.nextInt();
		
		for(int i = 1;i <= m;i++) {
			int v1 = scanner.nextInt();
			int v2 = scanner.nextInt();
			graph[v1][v2] = 1;
			graph[v2][v1] = 1;
		}
		bfs(graph);
	}

讀到這里,這篇“Java怎么實現圖的遍歷”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和林格尔县| 柘城县| 孟连| 墨脱县| 太保市| 江源县| 新巴尔虎左旗| 托克托县| 浑源县| 墨脱县| 芜湖市| 江源县| 宜宾县| 陈巴尔虎旗| 和政县| 武夷山市| 芒康县| 五常市| 中牟县| 武宣县| 青铜峡市| 吉首市| 漯河市| 平武县| 清河县| 太谷县| 通辽市| 泽库县| 遂宁市| 霍林郭勒市| 金湖县| 基隆市| 岑溪市| 巴彦淖尔市| 哈巴河县| 宁陕县| 扶沟县| 七台河市| 陇西县| 明水县| 石门县|