原题
请根据下列邻接矩阵完成图的遍历操作:
int[][] adjMatrix = new int[][]{{0,1,1,0,0,0,0,0},
{1,0,0,1,1,0,0,0},
{1,0,0,0,0,1,1,0},
{0,1,0,0,0,0,0,1},
{0,1,0,0,0,0,0,1},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,1,0,0},
{0,0,0,1,1,0,0,0}};
以下图为例,要求输出的结果为:
Output format:
v1 → v2 → v4 → v8 → v5 → v3 → v6 → v7
随后,请采用邻接表的形式完成对图的深度优先搜索遍历。要求输出的结果仍然与上述结果一致。
代码
package dfs;
import java.util.Scanner;
class Node {
String name;
int index;
Node next;
}
class Matrix {
int vexnum;
public void traverseMatrix(int[][] arr, int v_num) {
vexnum = arr.length;
int[] visit = new int[vexnum]; // 访问标志数组
System.out.print(" V" + v_num);
visit[v_num - 1] = 1;
for (int j = 0; j < arr[0].length; j++) {
if (arr[v_num - 1][j] == 1 && visit[j] == 0) {
matrixDfs(v_num, arr, visit);
}
}
}
public void matrixDfs(int num, int[][] arr, int[] visit) {
int i;
for (i = 0; i < arr[0].length; i++) {
if (arr[num - 1][i] == 1 && visit[i] == 0) {
visit[i] = 1;
System.out.print(" --> V" + (i + 1));
matrixDfs(i + 1, arr, visit);
}
}
}
}
class List {
Node[] Vexs; // 顶点数组
int vexnum; // 顶点数
// 前插法
public void CreatNodeFirst(int[][] arr) {
vexnum = arr.length;
Vexs = new Node[vexnum];
for (int i = 0; i < arr.length; i++) {
Vexs[i] = new Node();
Vexs[i].name = "V" + "" + (i + 1);
Vexs[i].index = i;
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
Node temp = new Node();
temp.name = "V" + "" + (j + 1);
temp.index = j;
if (Vexs[i].next == null) {
Vexs[i].next = temp;
} else {
temp.next = Vexs[i].next;
Vexs[i].next = temp;
}
}
}
}
}
// 后插法
public void CreatNodeLast(int[][] arr) {
vexnum = arr.length;
Vexs = new Node[vexnum];
for (int i = 0; i < arr.length; i++) {
Vexs[i] = new Node();
Vexs[i].name = "V" + "" + (i + 1);
Vexs[i].index = i;
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
Node temp1 = new Node();
temp1.name = "V" + "" + (j + 1);
temp1.index = j;
Node temp2 = Vexs[i];
while (temp2.next != null) {
temp2 = temp2.next;
}
temp2.next = temp1;
}
}
}
}
// 输出邻接表
public void print() {
System.out.println("该邻接表为:");
for (int i = 0; i < vexnum; i++) {
Node temp = Vexs[i];
System.out.print(i + " V" + (i + 1));
while (temp.next != null) {
temp = temp.next;
System.out.print(" --> " + temp.name);
}
System.out.println();
}
}
//邻接表的DFS
public void traverseList(int v_num) {
int[] visit = new int[vexnum]; // 访问标志数组
System.out.print("V" + v_num);
visit[v_num - 1] = 1;
while(Vexs[v_num - 1].next != null) {
listDfs(v_num, visit);
}
}
public void listDfs(int num, int[] visit) {
Node temp = Vexs[num - 1];
while(temp.next != null) {
temp = temp.next;
if(visit[temp.index] == 0) {
visit[temp.index] = 1;
System.out.print(" --> " + temp.name);
listDfs(temp.index + 1, visit);
}
}
}
}
public class MyDFS {
public static void main(String[] args) {
int[][] adjMatrix = new int[][] { { 0, 1, 1, 0, 0, 0, 0, 0 }, { 1, 0, 0, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 1, 1, 0 }, { 0, 1, 0, 0, 0, 0, 0, 1 }, { 0, 1, 0, 0, 0, 0, 0, 1 },
{ 0, 0, 1, 0, 0, 0, 1, 0 }, { 0, 0, 1, 0, 0, 1, 0, 0 }, { 0, 0, 0, 1, 1, 0, 0, 0 } };
Scanner input = new Scanner(System.in);
// 邻接矩阵的深度优先遍历:
System.out.println("******邻接矩阵的遍历******");
System.out.print("请输入你想从那个节点开始遍历:V");
int v_num1 = input.nextInt();
Matrix myMatrix = new Matrix();
myMatrix.traverseMatrix(adjMatrix,v_num1);
System.out.println();
System.out.println("******邻接表的遍历******");
List myList = new List();
System.out.println("构造邻接矩阵:(1)前插法,(2)后插法:");
int choice = input.nextInt();
if (choice == 1) {
myList.CreatNodeFirst(adjMatrix);
} else {
myList.CreatNodeLast(adjMatrix);
}
myList.print();
System.out.print("请输入你想从那个节点开始遍历:V");
int v_num2 = input.nextInt();
myList.traverseList(v_num2);
input.close();
}
}