package demo2;
import java.util.ArrayList;
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();
}
//根据前一个临界节点的下标获取下一个临界节点
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;
}
//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(){
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++;
}
}
DFS深度遍历算法
最新推荐文章于 2024-09-25 13:54:13 发布