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