package edu.xidian.graph; class MyStack { private final int SIZE = 20; private int[] st; private int top; public MyStack() { st = new int[SIZE]; top = -1; } public void push(int j) { st[++top] = j; } public int pop() { return st[top--]; } public int peek() { return st[top]; } public boolean isEmpty() { return (top == -1); } } class Vertex { public char label; public boolean wasVisited; public Vertex(char lab) { label = lab; wasVisited = false; } } public class Graph { private final int MAX_VERTS = 20; private Vertex vertexList[]; private int adjMat[][]; private int nVerts; private MyStack theStack; public Graph() { vertexList = new Vertex[MAX_VERTS]; adjMat = new int[MAX_VERTS][MAX_VERTS]; nVerts = 0; theStack = new MyStack(); } public void addVertex(char label) { vertexList[nVerts++] = new Vertex(label); } public void addEdge(int start, int end) { adjMat[start][end] = 1; adjMat[end][start] = 1; } public void displayVertex(int v) { System.out.print(vertexList[v].label); } public void dfs() { vertexList[0].wasVisited = true; displayVertex(0); theStack.push(0); while (!theStack.isEmpty()) { int v = getAdjUnvisitedVertex(theStack.peek()); if (v == -1) { theStack.pop(); } else { vertexList[v].wasVisited = true; displayVertex(v); theStack.push(v); } } for (int j = 0; j < nVerts; j++) { vertexList[j].wasVisited = false; } } public int getAdjUnvisitedVertex(int v) { for (int j = 0; j < nVerts; j++) { if (adjMat[v][j] == 1 && vertexList[j].wasVisited == false) { return j; } } return -1; } public static void main(String[] args) { Graph theGraph = new Graph(); theGraph.addVertex('A'); // 0 (start for dfs) theGraph.addVertex('B'); // 1 theGraph.addVertex('C'); // 2 theGraph.addVertex('D'); // 3 theGraph.addVertex('E'); // 4 theGraph.addEdge(0, 1); // AB theGraph.addEdge(1, 2); // BC theGraph.addEdge(0, 3); // AD theGraph.addEdge(3, 4); // DE System.out.print("Visits: "); theGraph.dfs(); System.out.println(); } }
graph_dfs
猜你喜欢
转载自hcx2013.iteye.com/blog/2225945
今日推荐
周排行