课程:程序设计与数据结构
班级: 1623
姓名: 石亚鑫
学号:20162303javascript
成绩: 2分
指导教师:娄嘉鹏 王志强
实验日期:11月20日java
实验密级: 非密级
预习程度: 已预习
实验时间:15:25-17:15数组
必修/选修: 必修
实验序号: cs_03网络
邻接矩阵 逻辑结构分为两部分:V和E集合。所以,用一个一维数组存放图中全部顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。
//添加结点 public void insertVertex(Object vertex) { vertexList.add(vertexList.size(),vertex); } //添加边 public void insertEdge(int v1,int v2,int weight) { edges[v1][v2]=weight; numOfEdges++; } //删除结点 public void deleteEdge(int v1,int v2) { edges[v1][v2]=0; numOfEdges--; }
//获得顶点的数目 public int getVertsCount() { return nVerts; } //获得边的数目 public int getNumOfEdges() { return nVerts; } public boolean isEmpty() { if ( vertexList.size()== 0) return true; else return false; }
//私有函数,深度优先遍历 private void depthFirstSearch(boolean[] isVisited,int i) { //首先访问该结点,在控制台打印出来 System.out.print(getValueByIndex(i)+" "); //置该结点为已访问 isVisited[i]=true; int w=getFirstNeighbor(i);// while (w!=-1) { if (!isVisited[w]) { depthFirstSearch(isVisited,w); } w=getNextNeighbor(i, w); } } //私有函数,广度优先遍历 private void broadFirstSearch(boolean[] isVisited,int i) { int u,w; LinkedList queue=new LinkedList(); //访问结点i System.out.print(getValueByIndex(i)+" "); isVisited[i]=true; //结点入队列 queue.addLast(i); while (!queue.isEmpty()) { u=((Integer)queue.removeFirst()).intValue(); w=getFirstNeighbor(u); while(w!=-1) { if(!isVisited[w]) { //访问该结点 System.out.print(getValueByIndex(w)+" "); //标记已被访问 isVisited[w]=true; //入队列 queue.addLast(w); } //寻找下一个邻接结点 w=getNextNeighbor(u, w); } }
十字链表 邻接表,存储方法跟树的孩子链表示法相相似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。
//添加结点 public void addVertex(Vertex vertex) { vertex.setIndex(nVerts); vertexList.add(vertex); nVerts++; } //添加边 public void addEdge(int start, int end) { vertexList.get(start).addAdj(vertexList.get(end)); if (!isDirected) { vertexList.get(end).addAdj(vertexList.get(start)); } } //删除边 public void deleteEdge(int start, int end) { vertexList.get(start).addAdj(vertexList.get(end)); if (!isDirected) { vertexList.get(end).addAdj(vertexList.get(start)); }}
//获得顶点的个数 public int getNumOfVertex() { return vertexList.size(); } //获得边的数目 public int getNumOfEdges() { return numOfEdges; } public boolean isEmpty() { if ( numOfEdges== 0) return true; else return false; }
// 深度优先遍历 public void dfs() { theStack = new StackX(nVerts); vertexList.get(0).wasVisted = true; dfs.add(vertexList.get(0)); theStack.push(vertexList.get(0)); Vertex vertex; while (!theStack.isEmpty()) { vertex = getAdjVertex((Vertex) theStack.peek()); if (vertex == null) { theStack.pop(); } else { vertex.wasVisted = true; dfs.add(vertex); theStack.push(vertex); } } } // 广度优先遍历 public void bfs() { theQueue = new Queue(nVerts); vertexList.get(0).wasVisted = true; bfs.add(vertexList.get(0)); theQueue.insert(vertexList.get(0)); Vertex vertex1; while (!theQueue.isEmpty()) { Vertex vertex2 = (Vertex) theQueue.remove(); while ((vertex1 = getAdjVertex(vertex2)) != null) { vertex1.wasVisted = true; bfs.add(vertex1); theQueue.insert(vertex1); } } }
建立计算机网络路由系统 输入网路中点到点的线路 以及每条线路使用的费用 系统输出网络中各点之间最便宜的路径 指出不相同的全部位置
根据个人见解,就是求出有权图的最短路径。数据结构
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 60min | 13.6% |
代码实现 | 300min | 68.1% |
测试 | 60min | 13.6% |
分析总结 | 20min | 4.5% |