图的深度遍历和广度遍历(JAVA)

package Graph_tu;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

public class Gragh {

	private ArrayList<String>vertexList;//存储节点
	private int[][]edges;//存储邻接矩阵
	private int numofEdges;
	private static boolean[] isVisited;//判断节点是否访问
	
	//构造
	public Gragh(int n)  {
	vertexList=new ArrayList<String>(n);
	edges=new int[n][n];
	numofEdges=0;
	}
	
	//节点数
	public int getnumofVertex() {
		return vertexList.size();
	}
	//边数
	public int getnumofEdges() {
		return numofEdges;
	}
	//节点i
	public String getValueofIndex(int i) {
		return vertexList.get(i);
	}
	
	//v1-v2权值
	public int getWeight(int v1,int v2) {
		return edges[v1][v2];
	}
	
	//插入节点
	public void insertVertex(String vertex) {
		vertexList.add(vertex);
	}
	
	//添加边
	public void insertEdge(int v1,int v2,int w) {
		edges[v1][v2]=w;
		edges[v2][v1]=w;
		numofEdges++;
	}
	
	//得到第一个结点的下标
	public int getfirstNeighbor(int index) {
		for(int j=0;j<vertexList.size();j++) {
			if(edges[index][j]>0) {
				return j;
			}
		}
		return -1;
	}
	
	//根据前一个邻接节点的下标获取下一个节点(获取v1除v2之外的邻接点)
	public int getNextneighbor(int v1,int v2) {
		for(int j=v2+1;j<vertexList.size();j++) {
			if(edges[v1][j]>0)
				return j;
		}
		return -1;
	}
	
	//显示图的邻接矩阵
	public void showGraph() {
		for(int[] i:edges) {
			System.out.println(Arrays.toString(i));//形式???
		}
	}
	//深度搜索(存在递归调用)
	public void dfs(boolean[] isvisited,int i) {
		//1.访问输出该节点
		System.out.print(getValueofIndex(i)+"--》");
		//2.设置为已访问
		isvisited[i]=true;
		//3.寻找该节点的第一个邻接点
		int w=getfirstNeighbor(i);
		//4.若w存在
		while(w!=-1) {
		//5.若未被访问过
			if(!isvisited[w]) {
				dfs(isvisited,w);
			}
		//6.若已被访问过
			w=getNextneighbor(i, w);
		}
	}
	
	//重载dfs
	public void dfs() {
		isVisited=new boolean[vertexList.size()];
		for(int i=0;i<getnumofVertex();i++) {
			if(!isVisited[i])
			dfs(isVisited,i);
		}
	}
	
	//广度搜索
	public void bfs(boolean isVisited[],int i) {
		int u;
		int w;
		//存标号
		LinkedList<Integer> queue=new<Integer> LinkedList();
		System.out.print(getValueofIndex(i)+"->");
		isVisited[i]=true;
		queue.addLast(i);//至此处理完成第一任首长
		//以初始点为开始遍历所有点
		while(!queue.isEmpty()) {
			u=queue.removeFirst();
			w=getfirstNeighbor(u);//下一任候选人
			while(w!=-1) {//还存在邻接点,当w=-1,返回大循环,更换前驱
				//若未被访问
				if(!isVisited[w]) {
				  System.out.print(getValueofIndex(w)+"->");	
				  isVisited[w]=true;
				  queue.addLast(w);//下一任首长
				}
				//访问u的另一邻接点,判断是否被访问
				w=getNextneighbor(u,w);
			}
		}
	}
	//重载bfs
	public void bfs() {
	isVisited=new boolean[vertexList.size()];
	for(int i=0;i<vertexList.size();i++) {
		if(!isVisited[i]) {
			bfs(isVisited,i);
		}
	}
	}
	
	public static void main(String[] args) {
		String vertexs[]= {"A","B","C","D","E"};
		Gragh graph=new Gragh(vertexs.length);
		for(String v:vertexs) {
			graph.insertVertex(v);
		}
		graph.insertEdge(0,1,1);
        graph.insertEdge(0,2,1);
        graph.insertEdge(1,2,1);
        graph.insertEdge(1,3,1);
        graph.insertEdge(1,4,1);
        
        graph.showGraph();
       // graph.dfs();
        graph.bfs();
		
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值