package tu;
import java.util.Stack;
/**无向图的基本实现
* 利用临接矩阵*/
public class Graph {
private int maxSize;
private Node node[];//用来保存节点
private int nitem;//节点个数
private int[][] edge;//保存边
private Stack<Integer> stack;//栈
/**构造函数 初始化*/
public Graph(int maxSize){
this.maxSize=maxSize;
node=new Node[maxSize];
edge=new int[maxSize][maxSize];
stack=new Stack<Integer>();
nitem=0;
}
/**添加节点*/
public void addNode(char lab){
node[nitem++]=new Node(lab);
}
/**添加边*/
public void addEdge(int start,int end){
edge[start][end]=1;
edge[end][start]=1;
}
/**
* 打印节点*/
public void display(int v){
System.out.print(node[v].label+" ");
}
/**深度优先遍历图*/
public void dfs(){
//从第一个节点开始遍历
node[0].wasVisited=true;
display(0);
stack.push(0);
while(!stack.empty()){
int v=getUnvisited(stack.peek());
if(v==-1){
stack.pop();
}else{
node[v].wasVisited=true;
display(v);
stack.push(v);
}
}
//还原标志位
for(int i=0;i<nitem;i++){
node[i].wasVisited=false;
}
}
/**获取没被访问的临接点*/
public int getUnvisited(int v){
for(int i=0;i<nitem;i++){
if(edge[v][i]==1&&node[i].wasVisited==false){
return i;
}
}
return -1;
}
public static void main(String[] args) {
Graph p=new Graph(8);
p.addNode('A');
p.addNode('B');
p.addNode('C');
p.addNode('D');
p.addNode('E');
p.addNode('F');
p.addNode('G');
p.addNode('H');
p.addEdge(0, 1);
p.addEdge(0, 6);
p.addEdge(0, 5);
p.addEdge(1, 2);
p.addEdge(6, 7);
p.addEdge(5, 4);
p.addEdge(7, 3);
p.dfs();
}
}
package tu;
public class Node {
public char label;
public boolean wasVisited;
public Node(char label){
this.label=label;
wasVisited=false;
}
}