java算法——图的遍历

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

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));
    }
}
发布了11 篇原创文章 · 获赞 7 · 访问量 1190

猜你喜欢

转载自blog.csdn.net/leangx86/article/details/101937882