为算法考试做准备--图的实现及广度和深度优先搜索实现

<pre name="code" class="java">package utils;

/**
 * 使用邻接表存储邻接点
 */
public class MyGraph<T> {
	protected MyArrayList<MyVertex<T>> verts;
	protected int nVerts;
	
	public MyGraph() {
		verts = new MyArrayList<MyVertex<T>>();
		nVerts = 0;
	}
	
	public void addVertex(T value) {
		MyVertex<T> newVert = new MyVertex<T>(value);
		verts.add(newVert);
		nVerts++;
	}
	
	public void addVertex(MyVertex<T> vert) {
		verts.add(vert);
		nVerts++;
	}
	
	public void addEdge(T sValue, T eValue, int weight) {
		MyVertex<T> sVert = new MyVertex<T>(sValue);
		MyVertex<T> eVert = new MyVertex<T>(eValue);		
		
		int sIndex = verts.indexOf(sVert);
		if (sIndex < 0) {
			addVertex(sVert);
			sIndex = verts.indexOf(sVert);
		}	
		
		int eIndex = verts.indexOf(eVert);
		if (eIndex < 0) {
			addVertex(eVert);
			eIndex = verts.indexOf(eVert);
		}
		MyEdge<T> edge = new MyEdge<T>(verts.get(sIndex), verts.get(eIndex), weight);
		verts.get(sIndex).addAdjEdge(edge);		
	}
	
	// 深度优先搜索
	public void dfs() {
		MyVertex<T> vert = verts.get(0);
		vert.setVisited(true);//从第一个结点开始搜索
		System.out.print(vert.getValue());
		
		MyStack<MyVertex<T>> stack = new MyStack<MyVertex<T>>(verts.size());
		stack.push(vert);
		while (!stack.isEmpty()) {
			vert = getAdjUnvisitedVertex(stack.peek());
			if (vert == null)
				stack.pop();
			else {
				vert.setVisited(true);
				System.out.print(vert.getValue());
				stack.push(vert);
			}
		}
		//重置访问标志
		for (int i = 0; i < nVerts; ++i) {
			verts.get(i).setVisited(false);
		}
	}
	
	//广度优先搜索
	public void bfs() {
		MyVertex<T> vert = verts.get(0);
		vert.setVisited(true);//从第一个结点开始搜索
		System.out.print(vert.getValue());
		
		MyQueue<MyVertex<T>> queue = new MyQueue<MyVertex<T>>(verts.size());
		queue.enqueue(vert);
		while (!queue.isEmpty()) {
			vert = queue.dequeue();
			MyVertex<T> v2;
			while((v2 = getAdjUnvisitedVertex(vert)) != null) {
				v2.setVisited(true);
				System.out.print(v2.getValue());
				queue.enqueue(v2);
			}
		}
		//重置访问标志
		for (int i = 0; i < nVerts; ++i) {
			verts.get(i).setVisited(false);
		}
	}
	
	//获取邻接表中未访问的顶点
	private MyVertex<T> getAdjUnvisitedVertex(MyVertex<T> vert) {
		for (int i = 0; i < vert.getEdgeNum(); ++i) {
			if (!vert.getEdge(i).eVert.ifVisited())
				return vert.getEdge(i).eVert;
		}
		return null;
	}
	
	public static void main(String[] args) {
		MyGraph<Character> graph = new MyGraph<Character>();
		graph.addVertex('A'); graph.addVertex('B');
		graph.addVertex('C'); graph.addVertex('D');
		graph.addVertex('E'); 
		
		graph.addEdge('A', 'B', 0);
		graph.addEdge('B', 'C', 0);
		graph.addEdge('A', 'D', 0);
		graph.addEdge('D', 'E', 0);
		System.out.print("深度优先搜索:");
		graph.dfs();
		System.out.println();
		System.out.print("广度优先搜索:");
		graph.bfs();
		System.out.println();
	}
}


 

猜你喜欢

转载自blog.csdn.net/zhangyingli/article/details/48086299
今日推荐