java算法——图的遍历

mac2022-06-30  22

实现图的自定义输入,以及深度优先、广度优先搜索。

import java.util.Scanner; public class Draw { static Graph G; public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入顶点数v和边数e:"); int v = sc.nextInt(); int e = sc.nextInt(); G = new Graph(v, e); System.out.println("请输入各顶点信息:"); for (int i = 0; i < G.v; i++) { G.adjList[i] = new VertexNode(); G.adjList[i].name = sc.next(); G.adjList[i].link = null; } System.out.println("请输入各边信息(用空格隔开):"); for (int i = 0; i < G.e; i++) { EdgeNode en1 = new EdgeNode(); String e1 = sc.next(); String e2 = sc.next(); int v1 = Index(e1); int v2 = Index(e2); en1.index = v1; en1.next = G.adjList[v2].link; G.adjList[v2].link = en1; EdgeNode en2 = new EdgeNode(); en2.index = v2; en2.next = G.adjList[v1].link; G.adjList[v1].link = en2; } System.out.println("输出邻接表存储情况:"); outGraph(); System.out.println("深度优先搜索过程如下:"); DFSGraph.DFS(G,0); System.out.println(); System.out.println("广度优先搜索过程如下:"); BFSGraph.BFS(G,0); } static void outGraph() {//输出邻接表 EdgeNode en = new EdgeNode(); for (int i = 0; i < G.e; i++) { System.out.print(G.adjList[i].name); en = G.adjList[i].link; while (en != null) { System.out.print("->" + G.adjList[en.index].name); en = en.next; } System.out.println(); } } static int Index(String e1) { for (int i = 0; i < G.v; i++) { if (G.adjList[i].name.equals(e1)){ return i; } } return -1; } } class Graph {//图 VertexNode[] adjList; int e; int v; boolean[] visit; public Graph(int v, int e) { this.v = v; this.e = e; adjList = new VertexNode[e + 1]; visit = new boolean[e + 1]; for (int i = 0; i < e; i++) { visit[i] = false; } } } class EdgeNode {//边 int index; int value; EdgeNode next; } class VertexNode {//节点 String name; EdgeNode link = new EdgeNode(); } class DFSGraph {//深度遍历图 public static void DFS(Graph G, int k) { System.out.print(G.adjList[k].name+" "); G.visit[k] = true; EdgeNode p = new EdgeNode(); p = G.adjList[k].link; while(p!=null){ if(G.visit[p.index]!=true){ DFS(G,p.index); } p=p.next; } } } class BFSGraph {//广度遍历图 public static void BFS(Graph G, int k) { int[] q=new int[G.adjList.length]; G.visit[k]=false; System.out.print(G.adjList[k].name+" "); int f=0,r=0,v=0; EdgeNode p = new EdgeNode(); p=G.adjList[k].link; do { while(p!=null) { v=p.index; if(G.visit[v]!=false) { r++; q[r]=v; System.out.print(G.adjList[v].name+" "); G.visit[v]=false; } p=p.next; } if(f!=r) { f++; v=q[f]; p=G.adjList[v].link; } }while((p!=null)&&(f!=r)); } }
最新回复(0)