#图的实现并没有指针与引用的概念,相对来说建立一个图的结构还是比较简单的,最重要的是图的两种遍历方式,DFS和BFS真是重要极了。很多时候。但一个问题没有捷径的时候,不妨采用暴力遍历的方法。
这里给出图的实现及其方法 先定义一下图的点类,图是由点与线段组成的
//图是由点和线组成的
//定义一个点的类
class Vertex{
public boolean WasVisited; //顶点是否访问
public String label; //顶点的名字
Vertex(String lbl){
this.label = lbl;
WasVisited = false;
}
}
然后我们定义一个图类,并定义一系列方法
//定义一个图类
//图中要可以添加顶点 可以添加边
class MyGragh{
private int NUM_Vertex; //顶点的数目
private Vertex[] verts; //存放顶点的数组
private int[][] adjMatrix; //定义二维的邻接矩阵
private int curVertNum; //当前是第几个顶点
MyGragh(int NUM_Vertex){
this.NUM_Vertex = NUM_Vertex; //初始化构造顶点的数目
verts = new Vertex[NUM_Vertex]; //顶点初始化
adjMatrix = new int[NUM_Vertex][NUM_Vertex]; //边的初始化
curVertNum = 0; //当前是第0个顶点
for (int i = 0; i < NUM_Vertex; i++) {
for (int j = 0; j < NUM_Vertex; j++) {
adjMatrix[i][j] = 0;
}
}
}
//给图添加顶点
public void addVertex(String label){
if(curVertNum<NUM_Vertex){
verts[curVertNum] = new Vertex(label);
curVertNum++;
}
else{
System.out.println("顶点已经添加完毕。。。。。");
}
}
//查看当前的顶点
public void ShowVertex(int cur){
if(cur<= curVertNum ){
System.out.println(verts[cur].label+"====");
}
else{
System.out.println("还没有这个顶点");
}
}
//给图添加边
public void addEdge(int i,int j){
if(i<NUM_Vertex && j<NUM_Vertex){
adjMatrix[i][j] = 1;
//无向图
adjMatrix[j][i] = 1;
}
else{
System.out.println("当前连接无效。。。"+i+" "+j);
}
}
//查看图的邻接表
public void ShowAdjMatrix(){
for (int i = 0; i < NUM_Vertex; i++) {
System.out.println();
for (int j = 0; j < NUM_Vertex; j++) {
System.out.print(adjMatrix[i][j]+" ");
}
}
}
public void setVertsFalse(){
for (int i = 0; i < NUM_Vertex; i++) {
verts[i].WasVisited = false;
}
}
//判断第i个节点是否还有点未曾遍历
public int IsUnvisitedAdjVerts(int i){
for (int j = 0; j < NUM_Vertex; j++) {
if(adjMatrix[i][j]==1&&verts[j].WasVisited == false){
return j;
}
}
return -1;
}
//深度优先遍历图 DepthFirstTraverse //栈的合理使用
public void DFS(int i){
System.out.println();
Stack<Integer> sta = new Stack<Integer>();
Vertex v1 = verts[i];
v1.WasVisited = true;
sta.push(i);
System.out.print(verts[i].label+" ");
while(sta.size()>0){
while(IsUnvisitedAdjVerts(i)!=-1){
i = IsUnvisitedAdjVerts(i);
System.out.print(verts[i].label+" ");
verts[i].WasVisited = true;
sta.push(i);
}
sta.pop();
if(sta.size()>0){
i = sta.peek();
}
}
}
//广度优先遍历 breadth-first search //队列的合理使用
public void BFS(int i){
System.out.println();
Queue<Integer> qu = new LinkedList<Integer>();
Vertex v1 = verts[i];
v1.WasVisited = true;
qu.offer(i);
int j;
while(qu.size()>0){
while(IsUnvisitedAdjVerts(i)!=-1){
j = IsUnvisitedAdjVerts(i);
qu.offer(j);
verts[j].WasVisited = true;
}
System.out.print(verts[qu.peek()].label+" ");
qu.poll();
if(qu.size()>0){
i = qu.peek();
}
}
}
}
图的测试,着重关注建立一个图
MyGragh mg = new MyGragh(10);
mg.addVertex("A");
mg.addVertex("B");
mg.addVertex("C");
mg.addVertex("D");
mg.addVertex("E");
mg.addVertex("F");
mg.addVertex("G");
mg.addVertex("H");
mg.addVertex("I");
mg.addVertex("J");
mg.addEdge(0, 1);
mg.addEdge(1, 2);
mg.addEdge(2, 3);
mg.addEdge(0, 4);
mg.addEdge(4, 5);
mg.addEdge(5, 6);
mg.addEdge(0, 7);
mg.addEdge(7, 8);
mg.addEdge(8, 9);
mg.addEdge(9, 10);
mg.ShowVertex(6);
mg.ShowAdjMatrix();