实现图的自定义输入,以及深度优先、广度优先搜索。
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));
}
}