邻接矩阵,邻接表的深度优先搜索

原题

请根据下列邻接矩阵完成图的遍历操作:
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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值