课程:《程序设计与数据结构》 班级: 1823 姓名: 孙铭泽 学号:20182305 实验教师:王志强 实验日期:2019年12月2日 必修/选修: 必修
(1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图须要本身定义(顶点个数、边个数,建议先在草稿纸上画出图,而后再输入顶点和边数)(2分)算法
(2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)数组
(3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)数据结构
(4) 完成无向图的最小生成树(Prim算法或Kruscal算法都可),并输出(3分)设计
(5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分)指针
public void create() { System.out.print("请输入结点数:"); vexnum = input.nextInt(); vexs = new char[vexnum]; // vexnum长度的顶点数组 isVisited = new int[vexnum]; System.out.print("请输入边数:"); arcnum = input.nextInt(); adjMatrix = new int[vexnum][vexnum]; //构建顶点数组 System.out.println("请依次输入顶点:"); for(int i=0;i<vexnum;i++) { vexs[i] = input.next().charAt(0); } //初始化邻接矩阵 for(int i=0;i<vexnum;i++) for(int j=0;j<vexnum;j++) adjMatrix[i][j]=0; int i = 0; int vexA, vexB; while (i < arcnum) { System.out.println("请输入相链接的结点"); vexA = input.nextInt(); while (vexA < 1 || vexA > vexnum) { System.out.println("范围不符合,请从新输入:"); vexA = input.nextInt(); } vexB = input.nextInt(); while (vexB < 1 || vexB > vexnum) { System.out.println("范围不符合,请从新输入:"); vexB = input.nextInt(); } adjMatrix[vexA - 1][vexB - 1] = 1; adjMatrix[vexB - 1][vexA - 1] = 1; if (i == arcnum - 1) { System.out.println("Ending!"); } else { System.out.println("Continue!"); } i++; } } ![](https://img2018.cnblogs.com/blog/1780041/201912/1780041-20191208152413735-451025846.png)
对图进行遍历操做code
public void DFS(int i) { isVisited[i]=1; System.out.print(vexs[i]); for(int j=0;j<vexnum;j++){ if(adjMatrix[i][j]==1&&isVisited[j]==0) { System.out.print("—>"); DFS(j); } } }
public void BFS() { char temp=(char)list.poll(); int x=temp-'0'; // 转换为数字 isVisited[x-1]=1; System.out.print(temp); List nerborpointlist=getCurrent(x-1); for(int i=0;i<nerborpointlist.size();i++){ char j=(char)nerborpointlist.get(i); list.add(j); int k=j-'0'; isVisited[k-1]=1; } if(!list.isEmpty()){ System.out.print("—>"); BFS(); } }
prim算法:对象
public void prim( float[][] weight) { //num为顶点数,weight为权 float[] lowcost = new float[vexnum + 1]; //到新集合的最小权 int[] closest = new int[vexnum + 1]; //表明与s集合相连的最小权边的点 boolean[] s = new boolean[vexnum + 1]; //s[i] == true表明i点在s集合中 s[1] = true; //将第一个点放入s集合 for(int i = 2; i <= vexnum; i++) { //初始化辅助数组 lowcost[i] = weight[1][i]; closest[i] = 1; s[i] = false; } for(int i = 1; i < vexnum; i++) { float min = Float.MAX_VALUE; int j = 1; for(int k = 2; k <= vexnum; k++) { if((lowcost[k] < min) && (!s[k])) {//根据最小权加入新点 min = lowcost[k]; j = k; } } System.out.println("加入点" + j + ". " + j + "---" + closest[j]);//新加入点的j和与j相连的点 s[j] = true;//加入新点j for(int k = 2; k <= vexnum; k++) { if((weight[j][k] < lowcost[k]) && !s[k]) {//根据新加入的点j,求得最小权 lowcost[k] = weight[j][k]; closest[k] = j; } } } }
最小生成树加入结点的顺序图blog
vexs[i] = input.next().charAt(0);
这条语句使用前没有初始化定义vexs[]
数组的长度,致使这样的错误。加上 vexs = new char[vexnum]; // vexnum长度的顶点数组
语句解决问题。后面的isVisited[]
数组用来判断是否访问过的数组也赶上了一样的问题,一样方法解决。此次的实验是将以前学过的许多内容进行结合和综合运用,难度并非很大,可是须要细细思考和耐心理解。否则还有不少地方容易出错。排序