1. 程式人生 > >JAVA實現圖的基本操作——生成鄰接表結構的圖、輸出鄰接矩陣、深度優先遍歷

JAVA實現圖的基本操作——生成鄰接表結構的圖、輸出鄰接矩陣、深度優先遍歷

1、定義的圖的資料結構,對於有向圖和無向圖是通用的。

2、在資料結構中定義了遍歷標誌,方便深度優先遍歷的實現。

3、遇到最大的bug就是:

	//weight=edgs[i].charAt(2);  //這裡特別容易出處,每次獲取int數值的時候都要特別注意。
	//weight=Character.getNumericValue(edgs[i].charAt(2));    //正確的處理應該要再轉換一次,用Character包裝類的方法
			
	String wei=edgs[i].substring(2);
	weight=Integer.valueOf(wei);
			


最開始是直接用String轉char,然後獲取的是ASCII碼值,跟輸入的權值不相等。

然後我就用了char的包裝類Character中的getNumbericValue方法,確實就獲取了int型別的資料,

但是這裡出了另一個問題: 如果是10以內的數字,這個方法是OK的,但是如果輸入為10,權值存的是edg.charAt(3)是1而不是10

所以最後我用的是獲取子串的方法,將剩下的資料打包成子串再轉成int,這樣就OK了。

最終程式碼如下:


import java.util.Scanner;

/** 
*  @author   LilyLee
 * @date     2017年4月25日
 * @time     下午8:02:01
 * @Version  1.0
 * @email    
[email protected]
* */ class GraphMatrix{ static final int MaxNum=20; static final int MaxValue=65535; char[] Vertex=new char [MaxValue];//頂點資訊 int GType;//圖的型別:無向圖/有向圖 int VertexNum;//頂點數量 int EdgeNum;//邊的數量 int [][] EdgeWeight=new int[MaxNum][MaxNum];//邊的權值 int [] isTrav=new int [MaxValue];//遍歷標誌 } public class My_Graph { public static void main(String[] args){ Scanner sc=new Scanner(System.in); GraphMatrix GM= new GraphMatrix(); System.out.println("輸入圖的型別:0為無向圖,1為有向圖"); GM.GType=sc.nextInt(); System.out.println("輸入頂點數量"); GM.VertexNum=sc.nextInt(); System.out.println("輸入全部頂點,如 ABCDEF"); String vd=sc.next(); System.out.println("輸入圖的邊數"); GM.EdgeNum=sc.nextInt(); String []edgs=new String[GM.EdgeNum]; System.out.println("輸入構成各邊的頂點及權值,如 :AB3 AC1 BC6 "); for(int i=0;i<GM.EdgeNum;i++){ edgs[i]=sc.next(); } ClearGraph(GM);//清空圖(也就是初始化,將所有邊置為無窮大) CreateGraph(GM,vd,edgs);//建立鄰接表結構的圖 System.out.println("該圖的鄰接矩陣如下"); OutGraph(GM);//輸出鄰接矩陣 DeepTraGraph(GM);//輸出深度優先搜尋遍歷結果 } static void CreateGraph(GraphMatrix GM,String vd,String [] edgs){ int weight; //權重 char startV,endV; //邊的起始點 int j=0,k=0; GM.Vertex=vd.toCharArray(); for(int i=0;i<GM.EdgeNum;i++){ startV=edgs[i].charAt(0); endV=edgs[i].charAt(1); //weight=edgs[i].charAt(2); //這裡特別容易出處,每次獲取int數值的時候都要特別注意。 //weight=Character.getNumericValue(edgs[i].charAt(2)); //正確的處理應該要再轉換一次,用Character包裝類的方法 String wei=edgs[i].substring(2); weight=Integer.valueOf(wei); for( j=0;startV!=GM.Vertex[j];j++); //查詢已有頂點中的開始點 for( k=0;endV!=GM.Vertex[k];k++);//查詢已有頂點中的結束點 GM.EdgeWeight[j][k]=weight; if(GM.GType==0){GM.EdgeWeight[k][j]=weight;} //如果是無向圖,則對角位置還要記錄一次 } } static void ClearGraph(GraphMatrix GM){ for(int i=0;i<GM.VertexNum;i++){ for(int j=0;j<GM.VertexNum;j++){ GM.EdgeWeight[i][j]=GraphMatrix.MaxValue; } } } static void OutGraph(GraphMatrix GM){ for(int i=0;i<GM.VertexNum;i++){ System.out.printf("\t%c",GM.Vertex[i]); } System.out.println("\n"); for(int j=0;j<GM.VertexNum;j++){ System.out.printf("%c",GM.Vertex[j]); for(int k=0;k<GM.VertexNum;k++){ if(GM.EdgeWeight[k][j]==GraphMatrix.MaxValue){System.out.printf("\t∞");} else{System.out.printf("\t%d",GM.EdgeWeight[k][j]);} } System.out.println("\n"); } } static void DeepTraGraph(GraphMatrix GM){ for(int i=0;i<GM.VertexNum;i++){GM.isTrav[i]=0;} //清理標誌位 for(int j=0;j<GM.VertexNum;j++){ if(GM.isTrav[j]==0){ DeepTraGraphOne(GM,j); } } } static void DeepTraGraphOne(GraphMatrix GM,int n){ //從某一個特定的節點開始深度遍歷圖 GM.isTrav[n]=1; //處理遍歷標誌位 System.out.printf("->"+GM.Vertex[n]); for(int i=0;i<GM.VertexNum;i++){ if(GM.EdgeWeight[n][i]!=GraphMatrix.MaxValue && GM.isTrav[n]==0){ DeepTraGraphOne(GM,i); } } } }


相關推薦

無向鄰接矩陣深度優先和廣度優先的遞迴與非遞迴演算法

/*(1)輸入一組頂點,建立無向圖的鄰接矩陣。 進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。*/ #include<stdio.h> #define max 40 //最大頂點個數 #define M 10000

無向鄰接矩陣深度優先廣度優先的遞迴與非遞迴演算法

/*(1)輸入一組頂點,建立無向圖的鄰接矩陣。 進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。*/ #include<stdio.h> #define max 40 //最大頂點個數 #define M 10000

JAVA實現基本操作——生成鄰接結構輸出鄰接矩陣深度優先

1、定義的圖的資料結構,對於有向圖和無向圖是通用的。 2、在資料結構中定義了遍歷標誌,方便深度優先遍歷的實現。 3、遇到最大的bug就是: //weight=edgs[i].charAt(2); //這裡特別容易出處,每次獲取int數值的時候都要特別注意。 //wei

鄰接實現--深度優先DFS和廣度優先BFS

          圖論中一個基本的概念就是遍歷。就是訪問到圖的每一個頂點,同時每個頂點只訪問一次。           DFS和BFS的概念和思路網上說明的很詳細了。但是網上很多程式碼實現有缺陷,基本都沒有考慮圖不連通的情況,比如某個頂點A和其它任何一個頂點都不關聯,

演算法:1鄰接實現深度優先,廣度優先

另一篇文章:是全部採用遞迴實現dfs,bfs:http://blog.csdn.net/codeforme/article/details/6036864#,這篇文章存在記憶體洩漏問題 我的bfs採用佇列實現,並且解決了記憶體洩漏問題 Graph.h /**********

資料結構學習筆記(四) 鄰接實現深度優先

一下是使用鄰接表儲存表示,實現圖的深度優先遍歷的示例。 用於遍歷的有向圖如下: #include<iostream> #define MaxVertexNum 6 using namespace std; //抽象資料型別 typedef c

鄰接儲存 深度優先 廣度優先 C語言實現

ALGraph.h #pragma once #include "Queue.h" /************************************************************************/ /

深度優先DFS(鄰接實現)c語言

要實現該演算法首先要知道鄰接表的概念。鄰接表是一種常用的圖的儲存結構,它的結構特點是:頂點由一個一維陣列儲存;鄰接點用連結串列儲存相比於單純用陣列實現的鄰接矩陣,鄰接表可以避免空間浪費其圖解如下:firstedge指向邊表第一個結點。邊表的adjvex的值代表與V0頂點有邊的

——鄰接表示(實現深度優先廣度優先

程式碼有部分解析:#include<iostream> #include<stdio.h> #include<stdlib.h> #include<iomanip> using namespace std; #define T

JAVA實現深度優先.

一:深度優先遍歷介紹.        1. 深度優先遍歷的定義:           假設圖中的所有的頂點都沒有訪問過,我們是任選一個頂點作為起始出發點(一般選擇使用節點集的第一個元素作為起始頂點)

6-1 鄰接矩陣儲存深度優先 (20 分) 第七章----基本概念-計算機17級

6-1 鄰接矩陣儲存圖的深度優先遍歷 (20 分) 試實現鄰接矩陣儲存圖的深度優先遍歷。 函式介面定義: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是鄰接矩陣儲存的圖

資料結構——PTA 鄰接矩陣儲存深度優先鄰接儲存的廣度優先

廣度優先與深度優先是遍歷圖的兩種基本方法,大致的思想是DFS為遞迴,而BFS是佇列。 這裡給出PTA兩道題目的答案,方法很基本,但第三個形參還是第一次見,去網上搜了搜給出的說法是呼叫函式的地址,但個人感覺就是呼叫這個函式。。。 下面給出兩段程式碼 void BFS ( LGraph

深度優先鄰接,遞迴,非遞迴)

參考部落格:圖的深度優先遍歷(遞迴、非遞迴;鄰接表,鄰接矩陣) 本程式碼有個問題:就是結點是對應儲存下標的,要解決這個問題,可以增加一個定位函式(LocateVec),不修改也可以使程式碼簡潔些 關於非連通圖的bug已修改,就是增加了dfsTraverse函式迴圈遍歷一遍結點:沒訪問過則再做一次dfs

深度優先和廣度優先Java實現

深度優先遍歷 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第一個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第一個鄰接結點。總結起來可以這樣說:每次都在訪問完當前結點後首先訪問當前結點的

C語言實現鄰接矩陣建立無向&深度優先

/* '鄰接矩陣' 實現無向圖的建立、深度優先遍歷*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 //最多頂點個數 #define INFINITY 32768

C語言實現鄰接矩陣儲存結構深度優先和廣度優先

DFS的核心思想在於對訪問的鄰接節點進行遞迴呼叫;BFS的核心思想在於建立了一個鄰接節點的佇列。 在Dev C++中除錯執行通過。 用下圖進行了測試。 #include <stdio.h> #define MaxVertexNum 50 #defin

Java實現深度優先和廣度優先

private int vertexSize;//頂點數量 public int getVertexSize() { return vertexSize; } public void setVertexSize(int vertexSize)

建立有向鄰接深度優先和廣度優先的遞迴與非遞迴演算法,判斷是否是有向無環,並輸出一種拓撲序列

/*(1)輸入一組頂點,建立有向圖的鄰接表,進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。 (2)根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。*/ #include<stdio.h>

資料結構與演算法(Java描述)-20鄰接矩陣有向的廣度優先深度優先

一、圖的基本概念圖:是由結點集合及結點間的關係集合組成的一種資料結構。結點和邊:圖中的頂點稱作結點,圖中的第i個結點記做vi。有向圖: 在有向圖中,結點對<x ,y>是有序的,結點對<x,y>稱為從結點x到結點y的一條有向邊,因此,<x,y>與<y,x>是兩條不同的邊。有向圖

資料結構---鄰接(建立列印深度優先,廣度優先C語言)

當一個圖為稀疏圖時,使用鄰接矩陣會浪費大量儲存空間。 鄰接表法結合了順序儲存和鏈式儲存方法,減少了不必要的浪費。 鄰接表 1)對圖G的每個頂點vi建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點vi的邊(對於有向圖則是以頂點vi為尾的弧)。這個單鏈表就稱為頂點vi