近由于项目需要,需要实现深度优先和广度优先算法,图论中的基础内容,源代码共享一下,希望对大家有用:
- public class Graph {
- private final int MAX_VERT=500;
- private Node nodelist[];
- private int adjMat[][];
- private int nverts;
- private Stack theStack;
- private Queue theQuene;
- public Graph(){
- //顶点数组
- nodelist=new Node[MAX_VERT];
- //邻接矩阵
- adjMat = new int[MAX_VERT][MAX_VERT];
- nverts=0;
- for(int i=0;i<MAX_VERT;i++){
- for(int j=0;j<MAX_VERT;j++){
- adjMat[i][j]=0;
- }
- }
- theStack=new Stack();
- theQuene=new LinkedList();
- sortedArray = new BusSiteBean[MAX_VERT];
- }
- /**
- * 增加一定点
- * @param node
- */
- public void addNode(Node node){
- nodelist[nverts++]=node;
- }
- /**
- * 增加一边
- * @param start
- * @param end
- */
- public void addEdge(int start,int end){
- adjMat[start][end]=1;
- //有向图
- //adjMat[end][start]=1;
- }
- public int getAdjUnVisited(int v){
- for(int j=0;j<nverts;j++){
- if(adjMat[v][j]==1&&nodelist[j].isWasVisited()==false){
- return j;
- }
- }
- return -1;
- }
- /**
- * 深度优先搜索算法
- */
- public void dfs(){
- nodelist[0].setWasVisited(true);
- displayNode(0);
- theStack.push(0);
- while(!theStack.isEmpty()){
- int v=((Integer)theStack.peek()).intValue();
- v=getAdjUnVisited(v);
- if(v==-1){
- theStack.pop();
- }else{
- nodelist[v].setWasVisited(true);
- displayNode(v);
- theStack.push(v);
- }
- }
- for(int j=0;j<nverts;j++){
- nodelist[j].setWasVisited(false);
- }
- }
- /**
- * 广度优先搜索算法
- */
- public void bfs(){
- this.nodelist[0].setWasVisited(true);
- this.displayNode(0);
- this.theQuene.add(0);
- int v2;
- while(!this.theQuene.isEmpty()){
- int v1=((Integer)this.theQuene.remove()).intValue();
- while((v2=this.getAdjUnVisited(v1))!=-1){
- this.nodelist[v2].setWasVisited(true);
- displayNode(v2);
- this.theQuene.add(v2);
- }
- }
- for(int j=0;j<nverts;j++){
- nodelist[j].setWasVisited(false);
- }
- }
- private int noSuccessors(){
- boolean isEdge;
- for(int row=0;row<this.nverts;row++){
- isEdge=false;
- for(int col=0;col<this.nverts;col++){
- if(adjMat[row][col]>0){
- isEdge=true;
- break;
- }
- }
- if(!isEdge)
- return row;
- }
- return -1;
- }
- /**
- * 有向图拓扑
- */
- public void poto(){
- int orig_nverts=this.nverts;
- while(this.nverts>0){
- int currentNode=noSuccessors();
- if(currentNode==-1){
- System.out.println("Graph 有环");
- return;
- }
- sortedArray[this.nverts-1]=nodelist[currentNode].getBs();
- deleteNode(currentNode);
- }
- for(int j=0;j<orig_nverts;j++){
- System.out.print(sortedArray[j]);
- }
- }
- private void deleteNode(int delVert){
- if(delVert!=this.nverts-1){
- for(int j=delVert;j<this.nverts-1;j++)
- this.nodelist[j]=this.nodelist[j+1];
- for(int row=delVert;row<this.nverts-1;row++)
- moveRowUp(row,this.nverts);
- for(int col=delVert;col<this.nverts-1;col++)
- moveRowLeft(col,this.nverts-1);
- }
- this.nverts--;
- }
- private void moveRowUp(int row,int length){
- for(int col=0;col<length;col++)
- adjMat[row][col]=adjMat[row+1][col];
- }
- private void moveRowLeft(int col,int length){
- for(int row=0;row<length;row++)
- adjMat[row][col]=adjMat[row][col+1];
- }
- public void displayNode(int v){
- System.out.println(nodelist[v].getBs().toString());
- }
- public static void main(String[] args) {
- Graph g=new Graph();
- g.addNode(new Node(new BusSiteBean("A")));
- g.addNode(new Node(new BusSiteBean("B")));
- g.addNode(new Node(new BusSiteBean("C")));
- g.addNode(new Node(new BusSiteBean("D")));
- g.addNode(new Node(new BusSiteBean("E")));
- g.addNode(new Node(new BusSiteBean("F")));
- g.addNode(new Node(new BusSiteBean("G")));
- g.addNode(new Node(new BusSiteBean("H")));
- g.addEdge(0, 3);
- g.addEdge(0, 4);
- g.addEdge(1, 4);
- g.addEdge(2, 5);
- g.addEdge(3, 6);
- g.addEdge(4, 6);
- g.addEdge(5, 7);
- g.addEdge(6, 7);
- g.poto();
- }
- }