package org.structure.graph;
import java.util.*;
/**
* 图 深度优先算法 广度优先遍历
* @author cjj_1
* @date 2020-09-03 11:10
*/
public class GraphDemo {
ArrayList<String> vertexList;
LinkedList<Integer> queue;
Map<String,Integer> vertexMap ;
boolean[] isVisited;
int[][] edges ;
int numOfEdges;
public static void main(String[] args) {
GraphDemo demo = new GraphDemo(5);
String[] vertex = {
"A","B","C","D","E"};
for(String s:vertex){
demo.inertVertex(s);
}
demo.addEdges(demo.vertexMap.get("A"),demo.vertexMap.get("B"),1);
demo.addEdges(demo.vertexMap.get("B"),demo.vertexMap.get("C"),1);
demo.addEdges(demo.vertexMap.get("A"),demo.vertexMap.get("D"),1);
demo.addEdges(demo.vertexMap.get("A"),demo.vertexMap.get("E"),1);
demo.addEdges(demo.vertexMap.get("B"),demo.vertexMap.get("C"),1);
demo.addEdges(demo.vertexMap.get("D"),demo.vertexMap.get("C"),1);
demo.printEdges();
// demo.dfs();//深度优先
demo.bfs();//广度优先算法
}
public GraphDemo(int n){
vertexList = new ArrayList<>(n);
queue = new LinkedList<Integer>();
vertexMap = new HashMap<String,Integer>(n);
edges = new int[n][n];
isVisited = new boolean[n];
numOfEdges =0;
}
/**
* 一个节点的广度优先遍历
* @param index
*/
public void bfs(int index){
System.out.print(vertexList.get(index)+"=>");
//加入队列
queue.add(index);
isVisited[index]=true;
int v;//当前节点
int w;//下驱
while (!queue.isEmpty()){
v = queue.removeFirst();
w = getFisrtNear(v);
while (w!=-1){
if(!isVisited[w]){
System.out.print(vertexList.get(w)+">=");
isVisited[w]=true;
queue.addLast(w);
}
w = getNextNear(v,w);
}
}
}
public void bfs(){
for (int i=0;i<vertexList.size();i++){
if(!isVisited[i]){
bfs(i);
}
}
}
/**
* 一个节点的深度优先遍历
* @param index
*/
public void dfs(int index){
System.out.print(vertexList.get(index)+"->");
isVisited[index]= Boolean.TRUE;
int w =getFisrtNear(index);
while (w!=-1){
if(!isVisited[w]){
dfs(w);
}
w = getNextNear(index,w);
}
}
public void dfs(){
for (int i=0;i<vertexList.size();i++){
if(!isVisited[i]){
dfs(i);
}
}
}
/**
* 获取当前节点的第一个临节点
* @param index
* @return
*/
public int getFisrtNear(int index){
for (int j=0;j<vertexList.size();j++){
if(edges[index][j]>0){
return j;
}
}
return -1;
}
/**
* 获取当前节点的下一个节点的下标
* @param index
* @param now
* @return
*/
public int getNextNear(int index,int now) {
for(int j = now+1;j<vertexList.size();j++){
if(edges[index][j]>0){
return j;
}
}
return -1;
}
/**
* 增加节点
* @param vertex
*/
public void inertVertex(String vertex){
vertexMap.put(vertex,vertexMap.size());
vertexList.add(vertex);
}
/**
* 增加边
* @param n
* @param m
* @param weigth
*/
public void addEdges(int n,int m,int weigth){
edges[n][m] = weigth;
edges[m][n] = weigth;
numOfEdges++;
}
public int getVertexNum(){
return vertexList.size();
}
public int getEdges(){
return numOfEdges;
}
/**
* 打印最后的矩阵
*/
public void printEdges(){
for (int row=0;row<edges.length;row++){
for (int col=0;col<edges[row].length;col++){
System.out.printf("%d\t",edges[row][col]);
}
System.out.println();
}
}
}
图的深度优先查找,与深度优先查找
猜你喜欢
转载自blog.csdn.net/weixin_40128696/article/details/108388707
今日推荐
周排行