每日一题——图的遍历(BFS 和DFS)

  • 题目描述

从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:

(1)计算结点的出度、入度以及度;

(2) 从第一个顶点出发,求一个深度优先遍历序列;

(3) 从第一个顶点顶点出发,求一个广度优先遍历序列。

注意:以用户输入各个顶点的顺序为顶点的序号。
在深度和广度优先遍历中,优先选择序号小的顶点。

  • java代码
public class Gragh
{
	AdjMatrix G;
	
	private boolean[] visited;

	public Gragh(){
		Scanner sc = new Scanner(System.in);
		System.out.println("输入顶点数和边数:");
		int vertexnum = sc.nextInt();
		int arcnum = sc.nextInt();
		
		G = new AdjMatrix(vertexnum,arcnum);
		
		System.out.println("输入顶点信息:");
		for(int i = 1;i <= G.vertexnum;i++)
		{
			G.vertex[i] = sc.next().charAt(0);
		}
		
		//初始化邻接矩阵
		for(int i = 1;i <= G.vertexnum;i++)
		{
			for(int j = 1;j <= G.vertexnum;j++)
			{
				G.arcs[i][j] = 0;
			}
		}
		
		//建立有向图
		System.out.println("输入头和尾顶点:");
	    int head = 0,tail = 0;
	    for(int i = 0;i < G.arcnum;i++)
	    {
	    	char vertex_head = sc.next().charAt(0);
		    char vertex_tail = sc.next().charAt(0);
	    	for(int j = 1;j <= G.vertexnum;j++)
	    	{
		    	if(G.vertex[j] == vertex_head)
		    	{
		    		head = j;
		    		for(int k = 1;k <= G.vertexnum;k++)
		    		{
				        if(G.vertex[k] == vertex_tail)
				    		tail = k;
				    }
			    }
		    }
	    	G.arcs[head][tail] = 1;
	    }
		sc.close();
	}
	
	/*
	 * 结点的出度、入度、度
	 */
	public void degree() {
		for(int i = 1;i <= G.vertexnum;i++)
		{
			int count_out = 0; int count_in = 0;int count = 0;
			for(int j = 1;j <= G.vertexnum;j++)
			{
				if(G.arcs[j][i] == 1)
					count_in++;
				if(G.arcs[i][j] == 1)
					count_out++;
				count = count_in + count_out;
			}
			System.out.println(G.vertex[i] + " " + count_out + " " + count_in + " "
					+ count);
		}
		
	}
	
	private void DFS(int start) {
		visited = new boolean[G.vertexnum + 1];
		Stack<Integer> s = new Stack<>();
		s.push(start);
		System.out.print(G.vertex[start]);
		visited[start] = true;
		while(!s.empty())
		{
			int top = s.peek();
			boolean is_push = false;
			for(int i = 1;i <= G.vertexnum;i++)
			{
				if(G.arcs[top][i] == 1 && visited[i] == false) 
				{
					System.out.print(G.vertex[i]);
					visited[i] = true;
					s.push(i);
					is_push = true;
					break;
				}
			}
			if(is_push == false) {
				s.pop();
			}
		}	
	}
	
	public void DFSTraverse() {
		visited = new boolean[G.vertexnum + 1];
		for(int i = 1;i <= G.vertexnum;i++)
		{
			if(visited[i] == false)
				DFS(i);
		}
	}
	
	private void BFS(int start) {
		visited = new boolean[G.vertexnum + 1];
		Queue<Integer> q = new LinkedList<>();
		System.out.print(G.vertex[start]);
		visited[start] = true;
		q.add(start);
		while(!q.isEmpty())
		{
			int top = q.poll();
			for(int i = 1;i <= G.vertexnum;i++)
			{
				if(G.arcs[top][i] == 1 && visited[i] == false) 
				{
					System.out.print(G.vertex[i]);
					visited[i] = true;
					q.add(i);
				}
			}
		}	
	}
	public void BFSTraverse() {
		visited = new boolean[G.vertexnum + 1];
		for(int i = 1;i <= G.vertexnum;i++)
		{
			if(visited[i] == false)
				BFS(i);
		}
	}
	
	/*
	 * 打印有向图
	 */
	public void showGragh(){
		System.out.print("   ");
		for (int i = 1; i <= G.vertexnum; i++)
		{//打印顶点信息
			System.out.print(G.vertex[i] + " ");
		}
		System.out.println();
		for (int i = 1; i <= G.vertexnum; i++)
		{//打印邻接矩阵
			System.out.print(G.vertex[i] + "  ");
			for (int j = 1; j <= G.vertexnum; j++)
			{
				System.out.print(G.arcs[i][j] + " ");
			}
			System.out.println();
		}
	}
}
class AdjMatrix{
	final int MAX_VERTEX = 20;                              //最大顶点个数
	int[][] arcs = new int[MAX_VERTEX][MAX_VERTEX];         //边信息
	char[] vertex = new char[MAX_VERTEX];                   //顶点信息
	int vertexnum;               //顶点数
	int arcnum;                  //边数
	AdjMatrix(int vertexnum,int arcnum) {
		this.vertexnum = vertexnum;
		this.arcnum = arcnum;
	}
}
  • 测试函数
public static void main(String[] args)
	{
		Gragh gragh = new Gragh();
		gragh.showGragh();
		gragh.degree();
		gragh.DFSTraverse();
		System.out.println();
		gragh.BFSTraverse();
	}

  • 运行结果

输入顶点数和边数:
5 7
输入顶点信息:
A B C D E
输入头和尾顶点:
A B
A E
B C
C D
D A
D B
E C
打印矩阵:
A B C D E
A 0 1 0 0 1
B 0 0 1 0 0
C 0 0 0 1 0
D 1 1 0 0 0
E 0 0 1 0 0
各顶点出度、入度、度:
A 2 1 3
B 1 2 3
C 1 2 3
D 2 1 3
E 1 1 2
DFS遍历:
ABCDE
BFS遍历:
ABECD

猜你喜欢

转载自blog.csdn.net/weixin_43574957/article/details/84961207