20192303 2020-2021-1 《資料結構與面向物件程式設計》實驗九報告
20192303 2020-2021-1《資料結構與面向物件程式設計》實驗九報告
課程:《程式設計與資料結構》
班級: 1923
姓名: 楊佳寧
學號: 20192303
實驗教師:王志強
實驗日期:2020年12月17日
必修/選修: 必修
一、實驗內容
圖的綜合實踐
(1) 初始化:根據螢幕提示(例如:輸入1為無向圖,輸入2為有向圖)初始化無向圖和有向圖(可用鄰接矩陣,也可用鄰接表),圖需要自己定義(頂點個數、邊個數,建議先在草稿紙上畫出圖,然後再輸入頂點和邊數)(2分)
(2) 圖的遍歷:完成有向圖和無向圖的遍歷(深度和廣度優先遍歷)(4分)
(3) 完成有向圖的拓撲排序,並輸出拓撲排序序列或者輸出該圖存在環(3分)
(4) 完成無向圖的最小生成樹(Prim演算法或Kruscal演算法均可),並輸出(3分)
(5) 完成有向圖的單源最短路徑求解(迪傑斯特拉演算法)(3分)
二、實驗過程及結果
(一) 初始化:根據螢幕提示(例如:輸入1為無向圖,輸入2為有向圖)初始化無向圖和有向圖(可用鄰接矩陣,也可用鄰接表),圖需要自己定義(頂點個數、邊個數,建議先在草稿紙上畫出圖,然後再輸入頂點和邊數)
(1)首先確定要建立的圖
程式設計實現上述圖,並建立成功
(二)圖的遍歷:完成有向圖和無向圖的遍歷(深度和廣度優先遍歷)
(三)完成有向圖的拓撲排序,並輸出拓撲排序序列或者輸出該圖存在環
拓撲演算法的程式碼:
import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class TopSort { Graph g ; public TopSort( Graph g) { this.g = g; g.buildGraphyou(); } public void topSort() { Queue<Vertex> queue= new LinkedList<Vertex>(); int length = g.getLength(); for(int i=0;i<length;i++) { if(g.getEnterEdgeNumber(g.v[i])==0) { queue.add(g.v[i]); } } System.out.print("拓撲順序為:"); while(!queue.isEmpty()) { Vertex ver = queue.poll(); ArrayList<Vertex> al = g.getAdjacentVertex(ver); for (Vertex vertex : al) { System.out.print(ver.from + " "); if (--vertex.indegree == 0) queue.add(vertex); } } if (!queue.isEmpty()){ System.out.println("存在環!"); } } }
因上述圖中存在環,故其沒有拓撲排序
使用另一個圖驗證拓撲排序功能的實現
(四)完成無向圖的最小生成樹(Prim演算法或Kruscal演算法均可),並輸出
這裡採用了Prim演算法
public class PrimTest { public static void main(String[] args) { bookGraph(); } public static void bookGraph(){ Prim prim = new Prim (6); shiyan9.Edge[] edges = new shiyan9.Edge[10]; edges[0] = new shiyan9.Edge(0,1,6); edges[1] = new shiyan9.Edge(1,4,3); edges[2] = new shiyan9.Edge(4,5,6); edges[3] = new shiyan9.Edge(5,3,2); edges[4] = new shiyan9.Edge(3,0,5); edges[5] = new shiyan9.Edge(0,2,1); edges[6] = new shiyan9.Edge(1,2,5); edges[7] = new shiyan9.Edge(4,2,6); edges[8] = new shiyan9.Edge(5,2,4); edges[9] = new shiyan9.Edge(3,2,5); for(int i = 0;i<10;i++){ prim.insertEdge(edges[i]); } prim.bianli(); prim.Prim(); } public static void randomGraph(){ Prim prim = new Prim(100); for(int i = 0;i<1000;){ int preV = (int)(Math.random()*100); int folV = (int)(Math.random()*100); int weight = (int)(Math.random()*100+1); if(preV != folV){ shiyan9.Edge edge = new Edge(preV,folV,weight); try{ prim.insertEdge(edge); i++; }catch(Exception e){ continue; } } } prim.bianli(); prim.Prim(); } }
(五)完成有向圖的單源最短路徑求解(迪傑斯特拉演算法)
三、實驗心得
上學期離散著重講了圖,因此對圖的理解要比對樹的更為深入。
本學期的資料結構與面向物件程式設計課程到此就結束了,收穫很多,同時我也不會放棄對JAVA這門程式語言的學習。
四、參考資料
https://www.cnblogs.com/xiaohuiduan/p/11352209.html