package demo2;
import java.util.ArrayList;
import java.util.LinkedList;
public class Tu {
//顶点
private static ArrayList<String> Numdengdian;
//边
private static Integer Numbian;
private static int[][] arr;
//定义一个数组判断是否被访问
private static boolean[] isVisited;
public static void main(String[] args) {
initTu(5);
//添加顶点
String[] str = {"A", "B", "C", "D", "E"};
for (String s : str) {
addDingdian(s);
}
//插入边
insert(0, 1, 1);
insert(0, 2, 1);
insert(1, 2, 1);
insert(1, 3, 1);
insert(1, 4, 1);
//打印
show();
System.out.println(getNumbian());
System.out.println("深度遍历:");
dfs();
System.out.println();
System.out.println("广度优先遍历:");
bfs();
}
//根据前一个临界节点的下标获取下一个临界节点
public static int getNextneighbor(int v1, int v2) {
for (int i = v2 + 1; i < Numdengdian.size(); i++) {
if (arr[v1][i] > 0) {
return i;
}
}
return -1;
}
//得到第一个邻接节点的下标w,如果没有返回-1
public static int getFirstneighbor(int index) {
for (int i = 0; i < Numdengdian.size(); i++) {
if (arr[index][i] > 0) {
return i;
}
}
return -1;
}
//BFS遍历
public static void bfs(boolean[] booleans, int i) {
int u;//表示队列头节点对应的下标
int w;//表示邻接节点
//定义一个队列,记录节点访问顺序
LinkedList list = new LinkedList();
//访问节点,输出节点信息
System.out.print(getValueByIndex(i) + "=>");
//标记该节点已经被访问
booleans[i] = true;
//将该节点假如队列
list.addLast(i);
while (!list.isEmpty()) {
//取出队列头节点的下标
u = (int) list.removeFirst();
//得到第一个邻接点的下标w
w = getFirstneighbor(u);
while (w != -1) {
//判断是否被访问
if (!isVisited[w]) {
//表示没有被访问
//访问节点,输出节点信息
System.out.print(getValueByIndex(w) + "=>");
//标记该节点已经被访问
booleans[w] = true;
//将该节点假如队列
list.addLast(w);
}
//以u为前驱点,找他的下一个邻接点
w = getNextneighbor(u, w);
}
}
}
//BFS重载
public static void bfs() {
isVisited = new boolean[Numdengdian.size()];
for (int i = 0; i < Numdengdian.size(); i++) {
if (!isVisited[i]) {
bfs(isVisited, i);
}
}
}
//DFS遍历
public static void dfs(boolean[] booleans, int i) {
System.out.print(getValueByIndex(i) + "->");
booleans[i] = true;
//查找第i个节点的邻接节点
int firstneighbor = getFirstneighbor(i);
while (firstneighbor != -1) {
if (!booleans[firstneighbor]) {
dfs(booleans, firstneighbor);
}
firstneighbor = getNextneighbor(i, firstneighbor);
}
}
//DFS重载
public static void dfs() {
isVisited = new boolean[Numdengdian.size()];
for (int i = 0; i < Numdengdian.size(); i++) {
if (!isVisited[i]) {
dfs(isVisited, i);
}
}
}
//通过索引获取值
public static String getValueByIndex(int i) {
return Numdengdian.get(i);
}
//遍历
public static void show() {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
//初始化图
public static void initTu(int n) {
arr = new int[n][n];
Numbian = 0;
Numdengdian = new ArrayList<>(n);
//isVisited = new boolean[n];
}
//获取边的数量
public static int getNumbian() {
return Numbian;
}
//添加顶点
public static void addDingdian(String s) {
Numdengdian.add(s);
}
//插入边
public static void insert(int v1, int v2, int weight) {
arr[v1][v2] = weight;
arr[v2][v1] = weight;
Numbian++;
}
}
java深度优先与广度优先算法----------DFS与BFS
最新推荐文章于 2024-09-25 13:54:13 发布