基于邻接矩阵的无向图的深度广度遍历实现

原创 2016年08月29日 18:47:35

图的创建及深度广度遍历的代码实现,基于的是邻接矩阵,图这里是无向图,并且两个顶点之间有连接则邻接矩阵非零,如果没有连接则为零

public class Graph {
	//图的邻接矩阵形式
	private int[][] edges;
	private int num;//图的结点数量
	private boolean[] visited ;//结点是否被访问过
	private Vertex[] vertex ;
	private int pre;//用来记录前一个访问的结点
	public Graph(){
		
	}
	public void createGraph(){
		Scanner in = new Scanner(System.in);
		System.out.print("please input the info:");
		String str = in.next();
		String[] temp = str.split(",");
		System.out.print(temp.length);
		this.num = temp.length;
		System.out.print(num);
		visited = new boolean[num];
		vertex = new Vertex[num];
		for(int i=0;i<num;i++){
			Vertex v = new Vertex(i,temp[i]);
			vertex[i]=v;
			visit(vertex[i]);
			System.out.println();
		}
		edges = new int[num][num];
		for(int i=0;i<num;i++){
		
			for(int j=0;j<num;j++){
				Scanner in1 = new Scanner(System.in);
				System.out.print("input the value:");
				int k = in1.nextInt();
				/* System.out.print(k);*/
				edges[i][j] =k;
			}
		}
		
	}
	public void visit(Vertex v){
		if(v!=null){System.out.print(MessageFormat.format("结点序号为{0},结点信息为{1}", v.no,v.info));
		System.out.println();
		}
		
	}
	public void dFS(int i){
		visit(vertex[i]);
		visited[i]=true;
		for(int j=i+1;j<num;j++){
			if(!visited[j]&&edges[i][j]!=0){
				dFS(j);
			}
		}
	}
	public void dFSTrave(){
		//深度遍历是在邻接矩阵的基础上进行的
		for(int i=0;i<num;i++){
			visited[i]=false;//默认情况下所有顶点是没有被访问过的
		}
		
			for(int i=0;i<num;i++){
				if(!visited[i]){//还需要考虑一个条件就是必须可达
					
					dFS(i);
					
				}
			}
			
		
		
		
	}
	//广度遍历则需要使用数据结构队列
	public void bFSTrave(){
		for(int i=0;i<num;i++){
			visited[i]=false;//默认情况下所有顶点是没有被访问过的
		}
		Vertex v=null;
		Queue queue = new Queue(100);
		for(int i=0;i<num;i++){
			if(!visited[i]){
				
				visit(vertex[i]);
				visited[i]=true;
				//访问完成后入队
				queue.EnQueue(queue, vertex[i]);
				while(!queue.isEmpty(queue)){
					v = queue.DeQueue(queue);
					if(v!=null){
						int k = v.no;
						for(int j=k+1;j<num;j++){
							if(!visited[j]&&edges[k][j]!=0){
								visit(vertex[j]);
								visited[j]=true;
								
								queue.EnQueue(queue, vertex[j]);
							}
					}
					
					}
				}
			}
		}
		
	}
	

}

public class Vertex {
	//图的顶点信息
  public	int no;//顶点的标号
  public String info;//顶点的信息
  public Vertex(int i,String info){
	  this.no = i;
	  this.info = info;
  }
	

}

public class Queue {
	private static int maxSize=100;
	private Vertex[] data;
	private int front;
	private int rear;
	
	public static int getMaxSize() {
		return maxSize;
	}
	public static void setMaxSize(int maxSize) {
		Queue.maxSize = maxSize;
	}
	public Vertex[] getData() {
		return data;
	}
	public void setData(Vertex[] data) {
		this.data = data;
	}
	public int getFront() {
		return front;
	}
	public void setFront(int front) {
		this.front = front;
	}
	public int getRear() {
		return rear;
	}
	public void setRear(int rear) {
		this.rear = rear;
	}
	public 	Queue(int maxSize){
		data = new Vertex[maxSize];
		front = 0;
		rear = 0;
		
	}
	public static boolean isEmpty(Queue q){
		if (q.front==q.rear){
			return true;
		}
		else return false;
		
	}
	public static void EnQueue(Queue q,Vertex node){
		System.out.print(maxSize);
		if((q.rear+1)%maxSize==q.front){
			System.out.print("队列已经满了");
			return;
			
		}else{
			q.data[q.rear]=node;
			q.rear =( q.rear+1)%maxSize;
		}
		
	}
	public static Vertex DeQueue(Queue q){
		if(isEmpty(q)){
			System.out.print("该队列为空");
			return null;
			
		}
		else{
			Vertex node = q.data[q.front];
			q.front = (q.front+1)%maxSize;
			return node;
		}
		
	}
	

}

public class Client_Graph {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Graph graph = new Graph();
		graph.createGraph();
		graph.dFSTrave();
		graph.bFSTrave();
		

	}

}

输入格式为:a,b,c,d代表四个个顶点

输入矩阵:0 0 1 0

                   0 0 1 1

                    1 1 0 0

                   0 1 0 0

逐个输入

版权声明:本文为博主原创文章,未经博主允许不得转载。

无向图--邻接矩阵、连接矩阵、深度遍历、广度遍历、生成树

1、开始生成的无向图 2、由图深度优先遍历生成的树  package graph;import java.util.ArrayList;import java.util.Iterator;import...
  • liangyihuai
  • liangyihuai
  • 2015年09月15日 13:46
  • 944

无向图的邻接矩阵表示和遍历

#include #include #include using namespace std; typedef char vertexType; //顶点的数据类型...
  • wwj_ff
  • wwj_ff
  • 2015年06月12日 15:08
  • 1841

无向图的构建及深度优先遍历---邻接矩阵实现

深度优先遍历(Depth-First Traversal) 假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问 出发点v,并将其标记为...
  • cjc211322
  • cjc211322
  • 2014年03月20日 21:31
  • 1652

基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS

广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索. BFS的思想:     ...
  • lxpaopao
  • lxpaopao
  • 2015年04月01日 14:18
  • 2093

C++ 无向图 邻接表创建 广度遍历 深度遍历

花了点时间,写了下 无向图lingjieb
  • abyssguru
  • abyssguru
  • 2014年11月24日 17:21
  • 1510

无向图的深度优先遍历和广度优先遍历(邻接链表)

我选的是邻接链表,建立如下图所示的图: 我把它画出来,图是这样子的: 对于深度优先遍历:是从一个顶点v出发,一步一步地向前推进,当找不到未访问过的顶点时,也是一步一...
  • lxw_xiangyu
  • lxw_xiangyu
  • 2014年06月04日 16:29
  • 3051

图的邻接矩阵表示、广度优先遍历和深度优先遍历

如上如的所示,对图节点进行编号,每个节点又有相应的编号和值。因此图可以有一个二阶矩阵来记录各个节点的联通关系,由一个数组来记录各个节点的内容。图的广度优先遍历和深度优先遍历。 输出如下: ...
  • u014698348
  • u014698348
  • 2017年01月18日 18:35
  • 923

无向图的广度优先遍历---邻接矩阵实现

基本思想: 1、从图中某个顶点V0出发,并访问此顶点; 2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点; 3、重复步骤...
  • cjc211322
  • cjc211322
  • 2014年03月20日 22:26
  • 1772

Java实现无向无权图的邻接矩阵的存储

Java实现无向无权图的邻接矩阵的存储 package graph4; /* * 基于邻接矩阵的图 */ public class Graph { final int max=100...
  • Coder_py
  • Coder_py
  • 2017年05月21日 16:09
  • 480

【数据结构】图Graph的邻接矩阵,邻接表及深度、广度遍历

图的分类 有/无向图 如果给图的每条边规定一个方向,那么得到的图称为有向图。在有向图中,与一个节点相关联的边有出边和入边之分。相反,边没有方向的图称为无向图。 下面介绍图的两种存储结构 1、...
  • shangguan_1234
  • shangguan_1234
  • 2016年11月27日 16:40
  • 1302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于邻接矩阵的无向图的深度广度遍历实现
举报原因:
原因补充:

(最多只允许输入30个字)