1、实验报告七 图及图的操作实验 班级: 姓名: 学号: 专业: 一、 实验目的: 1、掌握图的基本概念和术语 2、掌握图的存储结构及创建算法。 3、掌握图的遍历算法(递归或非递归算法)。 二、 实验内容: 1、图邻接矩阵存储结构表示及基本操作算法实现 (1)邻接矩阵存储结构类定义: 自定义如下: package Ex7.Ex7_1; import Ex5.Ex5_1.Matrix; import Ex7.Triple; import java.util.List; /** *
2、Created by 74062 on 2017/5/17.
*/
public class MatrixGraph
3、w Matrix(vertxList.size(),vertxList.size());
this.vertxList = vertxList;
for(Triple triple:TripleArray){
insertEdge(triple);
}
size = vertxList.size();
}
public MatrixGraph(List
4、ist.size(),vertxList.size()); size = vertxList.size(); this.vertxList = vertxList; } public void insertEdge(int i,int j, int weight){ if(i==j){ throw new IllegalArgumentException("不能插入自身环"); } if(weight<0||weight>MAX_WEIGHT)
5、 weight = MAX_WEIGHT; this.matrix.setElement(i,j,weight); } public void insertEdge(Triple triple){ insertEdge(triple.getRow(),triple.getColumn(),triple.getweigth()); } public void insertVertex(E x){ this.vertxList.add(x); if(size
6、 == matrix.getRow()){ ExtendMatrix(); } for(int j=0;j<=size;j++){ matrix.setElement(size,j,MAX_WEIGHT); matrix.setElement(j,size,MAX_WEIGHT); } size++; } public void removeEdge(int i,int j){ if(i==j){
7、 throw new IllegalArgumentException("i不能等于j"); } this.matrix.setElement(i,j,MAX_WEIGHT); } public void removeVertex(int i){ if(i<0||i>=vertxList.size()){ throw new IllegalArgumentException("i超出范围"); } int n= vertx
8、List.size();
vertxList.remove(i);
for(int j=i+1;j 9、setElement(j,k-1,matrix.getElement(j,k));
}
}
size--;
}
private int next(int i,int j){
int n = vertxList.size();
if(i>=0&&i 10、x.getElement(i,k) 11、int j=0;j 12、 string += vertxList.get(i)+" ";
for(int j=0;j 13、 ) {
this.matrix = new Matrix(vertxList.size(),vertxList.size());
this.vertxList = vertxList;
for(Triple triple:TripleArray){
insertEdge(triple);
}
size = vertxList.size();
}
public MatrixGraph(List 14、ze(),vertxList.size());
size = vertxList.size();
this.vertxList = vertxList;
}
(3)输出邻接矩阵结果算法
public String toString() {
String string = "";
for(int i=0;i 15、x.getElement(i,j)+" ";
}
string +="\n";
}
return string;
}
测试结果粘贴如下:
2、图邻接表存储结构表示及基本操作算法实现
(1)邻接表存储结构类定义:
自定义如下:
package Ex7.Ex7_2;
import Ex2.Ex2_1.MyList;
import Ex5.Ex5_2.Element;
import Ex5.Ex5_2.LinkedMatrix;
import Ex5.Ex5_2.LinkedMatrixRow;
im 16、port Ex7.Triple;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by 74062 on 2017/5/31.
*/
public class AdjListGraph 17、
private List 18、
public AdjListGraph(Triple[] TripleArray, List 19、getweigth());
}
size = vertxList.size();
}
public void insertEdge(int i,int j,int weight){
if(i==j){
throw new IllegalArgumentException("i,j不能相等");
}
if(weight<0||weight>=MAX_WEIGHT)
weight=0;
adjlist. 20、setElement(i,j,weight);
}
public void insertVertex(E x){
vertxList.add(x);
int i = vertxList.size();
if(vertxList.size()>adjlist.getRow()){
adjlist.setRow(i+1);
adjlist.setColumn(i+1);
}
adjlist.addLine();
21、 size++;
}
public void removeEdge(int i,int j){
if(i==j){
throw new IllegalArgumentException("i,j不能相等");
}
adjlist.setElement(i,j,0);
}
@Override
public String toString() {
StringBuffer stringBuffer = new StringBuff 22、er();
for(int i=0;i 23、)){
Element element = iterator.next();
stringBuffer.append("("+i+",")
.append(element.getColumn()+",").append(element.getValue()+")");
}
stringBuffer.append("\n");
}
return stringBuffer.toString 24、);
}
public void removeVertex(int i){
if(i<0||i>vertxList.size()){
throw new IllegalArgumentException("i超出范围");
}
int n = vertxList.size();
LinkedMatrixRow linkedMatrixRow = adjlist.getRowLine(i);
Iterator 25、it = linkedMatrixRow.iterator();
while (it.hasNext()){
Element element = it.next();
removeEdge(i,element.getColumn());
}
n--;
adjlist.setRow(n);
adjlist.setColumn(n);
for(int j=0;j 26、 LinkedMatrixRow tempLinkedMatrixRow = adjlist.getRowLine(i);
Iterator 27、 vertxList.remove(i);
size--;
}
private int next(int i,int j){
int n = vertxList.size();
if(i>=0&&i 28、erator();
if(j==-1)
return iterator.hasNext()?iterator.next().getColumn():-1;
MyList.Node 29、 return node.data.getColumn();
}
}
return -1;
}
public void DFSTraverse(int i){
boolean[] visited = new boolean[vertxList.size()];
int j=i;
do{
if(!visited[j]){
System.out.print("{");
30、 this.depthfs(j,visited);
System.out.print("}");
}
j = (j+1)%vertxList.size();
}while (j!=i);
System.out.println();
}
private void depthfs(int i,boolean[] visited){
System.out.print(vertxList.get(i)+" ");
31、 visited[i] = true;
int j = this.next(i,-1);
while (j!=-1){
if(!visited[j])
depthfs(j,visited);
j=this.next(i,j);
}
}
public void BFSTraverse(int i){
boolean[] visited = new boolean[vertxList.size()];
32、 int j = i;
do{
if(!visited[j]){
System.out.print("{");
breadthfs(j,visited);
System.out.print("}");
}
j = (j+1)%vertxList.size();
}while (j!=i);
System.out.println();
}
33、 public void breadthfs(int i, boolean[] visited){
System.out.print(vertxList.get(i)+" ");
visited[i] = true;
Queue 34、or(int j=next(i,-1);j!=-1;j=next(i,j)){
if(!visited[j]){
System.out.print(vertxList.get(j)+" ");
visited[j] = true;
queue.add(j);
}
}
}
}
}
(2)创建邻接表算法
public AdjLi 35、stGraph(int length){
vertxList = new ArrayList 36、 this.vertxList = vertxList;
for(Triple triple:TripleArray){
insertEdge(triple.getRow(),triple.getColumn(),triple.getweigth());
}
size = vertxList.size();
}
(3)输出邻接表结果算法
@Override
public String toString() {
StringBuffer stringBuffer = new StringBuffer();
37、
for(int i=0;i 38、ement = iterator.next();
stringBuffer.append("("+i+",")
.append(element.getColumn()+",").append(element.getValue()+")");
}
stringBuffer.append("\n");
}
return stringBuffer.toString();
}
测试结果粘贴如下:
3、图的遍历递归算法
(1)(存储结构为邻接表)深度优先遍历算法 39、
递归算法:
public void DFSTraverse(int i){
boolean[] visited = new boolean[vertxList.size()];
int j=i;
do{
if(!visited[j]){
System.out.print("{");
this.depthfs(j,visited);
System.out.print("}");
}
j = (j+1)%vertxList.size 40、);
}while (j!=i);
System.out.println();
}
private void depthfs(int i,boolean[] visited){
System.out.print(vertxList.get(i)+" ");
visited[i] = true;
int j = this.next(i,-1);
while (j!=-1){
if(!visited[j])
depthfs(j,visited);
j=this.n 41、ext(i,j);
}
}
测试结果粘贴如下:
(2)广度优先遍历算法
非递归算法
public void BFSTraverse(int i){
boolean[] visited = new boolean[vertxList.size()];
int j = i;
do{
if(!visited[j]){
System.out.print("{");
breadthfs(j,visited);
System.out.pr 42、int("}");
}
j = (j+1)%vertxList.size();
}while (j!=i);
System.out.println();
}
public void breadthfs(int i, boolean[] visited){
System.out.print(vertxList.get(i)+" ");
visited[i] = true;
Queue 43、eue.add(i);
while (!queue.isEmpty()){
i = queue.poll();
for(int j=next(i,-1);j!=-1;j=next(i,j)){
if(!visited[j]){
System.out.print(vertxList.get(j)+" ");
visited[j] = true;
queue.add(j);
}
}
}
}
测试结果粘贴如下:
三、 实验心得(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)






