1、图结构
public static int max_ver_num=10;
//图
class MGraph{
char ver[]=new char[max_ver_num]; //顶点向量
int arc[][]=new int[max_ver_num][max_ver_num]; //邻接矩阵
int vernum,arcnum; //当前顶点数,边数
public MGraph(int vernum, int arcnum){
this.vernum=vernum;
this.arcnum=arcnum;
}
}
- 解析:如上图,A~E表示顶点向量ver[],矩阵里的数字表示是arc[][]里面的值。上图的顶点A~E共5个顶点,1表示边的数量*2(注意,上图是无向图)。
- 需要注意的是,下面的栈记录的是顶点在顶点向量的位置。如A的位置为0,B的位置为1,以此类推。
2、深度遍历
//深度遍历,从第n个元素开始遍历
public void Graph_depth(MGraph mg,int n){
int[] visited=new int[mg.vernum];
visited[n]=1; //从第一个顶点开始遍历
Stack<Integer> s=new Stack<Integer>();
s.push(n); //入栈
int i;
while(!s.isEmpty()){
n=s.peek(); //取栈顶元素
for(i=0;i<mg.vernum;i++){
if(mg.arc[n][i]!=0 && mg.arc[n][i]!=Integer.MAX_VALUE && visited[i]==0){
System.out.print(mg.ver[i]+"\t");
visited[i]=1;
s.push(i); //入栈
break;
}
}
if(i==mg.vernum) //没有元素可以入栈了
s.pop(); //出栈
}
}
- 解析:开始将第n个顶点入栈(栈只记录顶点位置),当栈不空时进入while循环。取栈顶元素并赋给n(不出栈),从矩阵的第n行开始横向扫描,一直到没有元素可以入栈了就出栈,直到栈为空退出while循环。
- 需要注意的是入栈条件:当有边时(arc[n][i]=权值)且还没访问过(visited[i]=0)
3、深度遍历
//广度遍历,从第n个元素开始遍历
public void Graph_breath(MGraph mg,int n){
int visited[]=new int[mg.vernum];
Queue<Integer> q=new LinkedBlockingQueue<Integer>();
visited[n]=1; //已访问
q.offer(n);
while(!q.isEmpty()){
n=q.poll(); //出队
for (int i = 0; i < mg.vernum; i++) {
if(mg.arc[n][i]!=0&&mg.arc[n][i]!=Integer.MAX_VALUE&&visited[n]==0){
System.out.println(mg.ver[n]);
visited[n]=1;
q.offer(n); //入队
}
}
}
}
- 解析:开始将第n个顶点入队列(队列只记录顶点位置),当队列不空时进入while循环。元素出队并赋给n,从矩阵的第n行开始横向扫描,有边且还没访问过就入队,直到队列为空退出while循环