图的构建深度优先和广度优先

图结构

1. 图的构建

<pre>
package GraphPackage;
import java.util.Arrays;
class Edge{
	String beginCity;
	String endCity;
	int cost;
	
	public Edge(String beginCity, String endCity, int cost) {
		super();
		this.beginCity = beginCity;
		this.endCity = endCity;
		this.cost = cost;
	}
}
public class Graph {
	String[] cityArray;
	int[][] matrix;
	int size;
	public Graph(String[] cityArray, Edge[] edges, boolean direction) {
		this.cityArray = cityArray;
		this.size = cityArray.length;
		matrix = new int[size][size]; //根据顶点数创建矩阵
		for (Edge edge: edges) {
			int i = findIndex(edge.beginCity,cityArray);
			int j = findIndex(edge.endCity,cityArray);
			matrix[i][j] = edge.cost;
			if(!direction) {
				matrix[j][i] = edge.cost;
			}
		}
	}
	public int findIndex(String city, String[] cityArray) {
		for (int i = 0; i < cityArray.length; i++) {
			if(city.equals(cityArray[i])) {
				return i;
			}
		}
		return -1;
	}
	public void graphPrint() {
		for (int[] ii : matrix) {
			System.out.println(Arrays.toString(ii));
		}
	}
} 
</pre>

2. 深度优先搜索

<pre>
    	public void dfs(int start, int[] visit) {
    		//深度优先搜索
    		System.out.println(cityArray[start] + " ");
    		visit[start] =1; 
    		for (int i = 0; i < visit.length; i++) {
    			if (matrix[start][i] > 0 && visit[i] == 0) {
    				dfs(i, visit);
    			}
    		}
    	}
 </pre>

3. 广度优先搜索

<pre>
public void bfs(int start) {
		//广度优先搜索
		int[] visit = new int[size];
		Queue queue = new Queue(100);
		queue.inputData(start);
		while(!queue.isEmpty()) {
			int index = queue.outputData();
			System.out.println(cityArray[index]);
			visit[index] = 1;
			for (int i = 0; i < visit.length; i++) {
				if(matrix[index][i] != 0 && visit[i] == 0) {
					queue.inputData(i);
					visit[i] = 1;
				}
			}
		}
	}
</pre>

4. 测试

<pre>
package GraphPackage;
import java.util.ArrayList;
public class GraphTest {
	public static void main(String[] args) {
		Graph graph = creatGraph(false);
		System.out.println("图矩阵如下:");
		graph.graphPrint();
		int[] visit = new int[graph.size];
		System.out.println("深度优先搜索顺序如下:");
		graph.dfs(0, visit);
		System.out.println("广度优先搜索顺序如下:");
		graph.bfs(0);
	}
	public static Graph creatGraph(boolean direction) {
		String[] citys = {"北京","上海","广州","重庆","武汉","南昌"};
		ArrayList<Edge> edgeList = new ArrayList<Edge>();
		edgeList.add(new Edge("北京","广州",10));
		edgeList.add(new Edge("北京","上海",11));
		edgeList.add(new Edge("上海","南昌",6));
		edgeList.add(new Edge("广州","重庆",14));
		edgeList.add(new Edge("广州","武汉",9));
		edgeList.add(new Edge("重庆","武汉",20));
		edgeList.add(new Edge("武汉","北京",13));
		edgeList.add(new Edge("武汉","南昌",12));
		edgeList.add(new Edge("南昌","广州",18));
		Edge[] edgeArray = new Edge[edgeList.size()];

		return new Graph(citys,edgeList.toArray(edgeArray),direction);
	}
}
</pre>
发布了14 篇原创文章 · 获赞 0 · 访问量 1852

猜你喜欢

转载自blog.csdn.net/dfjaadada/article/details/104427897