邻接矩阵的图遍历—深度、广度 java实现

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;
		}
	}


        
《邻接矩阵的图遍历—深度、广度 java实现》

  • 解析:如上图,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循环
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/weichen_Hi/article/details/79605197
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞