17 、图深度优先遍历——java数据结构
程序员文章站
2022-05-24 09:49:05
...
17 、图深度优先遍历
编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至n-1。本题限定在深度优先遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。
输入格式:
输入第一行为两个整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过50。接下来e行表示每条边的信息,每行为两个整数a、b,表示该边的端点编号,但各边并非按端点编号顺序排列。
输出格式:
输出为一行整数,每个整数后一个空格,即该有向图的深度优先遍历结点序列。
输入样例1:
3 3
0 1
1 2
0 2
输出样例1:
0 1 2
输入样例2:
4 4
0 2
0 1
1 2
3 0
输出样例2:
0 1 2 3
代码如下:
import java.util.Scanner;
public class Main {
/** 存储节点信息*/
private int[] vertices;
/** 存储边信息(邻接矩阵)*/
private int[][] arcs;
/** 图的节点数*/
private int vexnum;
/** 记录节点是否已被遍历*/
private boolean[] visited;
/** 初始化*/
public Main(int n) {
vexnum = n;
vertices = new int[n];
arcs = new int[n][n];
visited = new boolean[n];
for (int i = 0; i < vexnum; i++) {
for (int j = 0; j < vexnum; j++) {
arcs[i][j] = 0;
}
}
}
/** 添加边*/
public void addEdge(int i, int j){
if(i==j){
return ;
}
// 无向图对称的.
arcs[i][j]=1;
arcs[j][i]=1;
}
/** 设置节点集**/
public void setVertices(int[] vertices){
this.vertices=vertices;
}
/** 打印遍历节点*/
public void visit(int i){
System.out.print(vertices[i]+ " ");
}
/** 从第i节点开始深度优先遍历*/
public void traverse(int i){
// 标记第i个节点已遍历
visited[i]=true;
// 打印当前已经遍历的节点
visit(i);
// 遍历邻接矩阵中第i个节点的直接连通节点
for(int j=0;j<vexnum;j++){
if(arcs[i][j]==1&&visited[j]==false){
traverse(j);
}
}
}
public void dfs(){
// 初始化节点访问标记
for(int i=0;i<visited.length;i++){
visited[i]=false;
}
// 从没有被遍历的节点开始深度优先遍历
for(int i=0;i<vexnum;i++){
// 如果没有被访问过.
if(visited[i]==false){
traverse(i);
}
}
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int e=input.nextInt();
Main dfs = new Main(n);
int[] vertices = new int[n];
// 添加节点集
for (int i=0;i<n;i++){
vertices[i]=i;
int a=input.nextInt();
int b=input.nextInt();
dfs.addEdge(a, b);
}
// 设置顶点集
dfs.setVertices(vertices);
dfs.dfs();
}
}
输出结果:
上一篇: spring框架之AOP(面向切面编程)
下一篇: spring IOC底层原理