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