<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
今日推荐
周排行