图论—深度优先和广度优先算法源码

近由于项目需要,需要实现深度优先和广度优先算法,图论中的基础内容,源代码共享一下,希望对大家有用:

 
Java代码 复制代码
  1. public class Graph {      
  2.     private final int MAX_VERT=500;      
  3.     private Node nodelist[];      
  4.     private int adjMat[][];      
  5.     private int nverts;      
  6.     private Stack theStack;      
  7.     private Queue theQuene;      
  8.           
  9.     public Graph(){      
  10.         //顶点数组      
  11.         nodelist=new Node[MAX_VERT];      
  12.         //邻接矩阵      
  13.         adjMat = new int[MAX_VERT][MAX_VERT];      
  14.         nverts=0;      
  15.         for(int i=0;i<MAX_VERT;i++){      
  16.             for(int j=0;j<MAX_VERT;j++){      
  17.                 adjMat[i][j]=0;      
  18.             }      
  19.         }      
  20.         theStack=new Stack();      
  21.         theQuene=new LinkedList();      
  22.         sortedArray = new BusSiteBean[MAX_VERT];      
  23.     }      
  24.           
  25.     /**    
  26.      * 增加一定点    
  27.      * @param node    
  28.      */     
  29.     public void addNode(Node node){      
  30.         nodelist[nverts++]=node;      
  31.     }      
  32.           
  33.     /**    
  34.      * 增加一边    
  35.      * @param start    
  36.      * @param end    
  37.      */     
  38.     public void addEdge(int start,int end){      
  39.         adjMat[start][end]=1;      
  40.         //有向图      
  41.         //adjMat[end][start]=1;      
  42.     }      
  43.           
  44.     public int getAdjUnVisited(int v){      
  45.         for(int j=0;j<nverts;j++){      
  46.             if(adjMat[v][j]==1&&nodelist[j].isWasVisited()==false){      
  47.                 return j;      
  48.             }      
  49.         }      
  50.         return -1;      
  51.     }      
  52.           
  53.     /**    
  54.      * 深度优先搜索算法    
  55.      */     
  56.     public void dfs(){      
  57.         nodelist[0].setWasVisited(true);      
  58.         displayNode(0);      
  59.         theStack.push(0);      
  60.         while(!theStack.isEmpty()){      
  61.             int v=((Integer)theStack.peek()).intValue();      
  62.             v=getAdjUnVisited(v);      
  63.                   
  64.             if(v==-1){      
  65.                 theStack.pop();      
  66.             }else{      
  67.                 nodelist[v].setWasVisited(true);      
  68.                 displayNode(v);      
  69.                 theStack.push(v);      
  70.             }      
  71.         }      
  72.         for(int j=0;j<nverts;j++){      
  73.             nodelist[j].setWasVisited(false);      
  74.         }      
  75.     }      
  76.           
  77.     /**    
  78.      * 广度优先搜索算法    
  79.      */     
  80.     public void bfs(){      
  81.         this.nodelist[0].setWasVisited(true);      
  82.         this.displayNode(0);      
  83.         this.theQuene.add(0);      
  84.         int v2;      
  85.         while(!this.theQuene.isEmpty()){      
  86.             int v1=((Integer)this.theQuene.remove()).intValue();      
  87.             while((v2=this.getAdjUnVisited(v1))!=-1){      
  88.                 this.nodelist[v2].setWasVisited(true);      
  89.                 displayNode(v2);      
  90.                 this.theQuene.add(v2);      
  91.             }      
  92.         }      
  93.         for(int j=0;j<nverts;j++){      
  94.             nodelist[j].setWasVisited(false);      
  95.         }             
  96.     }      
  97.           
  98.     private int noSuccessors(){      
  99.         boolean isEdge;      
  100.         for(int row=0;row<this.nverts;row++){      
  101.             isEdge=false;      
  102.             for(int col=0;col<this.nverts;col++){      
  103.                 if(adjMat[row][col]>0){      
  104.                     isEdge=true;      
  105.                     break;      
  106.                 }      
  107.             }      
  108.             if(!isEdge)      
  109.                 return row;      
  110.         }      
  111.         return -1;      
  112.     }      
  113.           
  114.     /**    
  115.      * 有向图拓扑    
  116.      */     
  117.     public void poto(){      
  118.         int orig_nverts=this.nverts;      
  119.         while(this.nverts>0){      
  120.             int currentNode=noSuccessors();      
  121.             if(currentNode==-1){      
  122.                 System.out.println("Graph 有环");      
  123.                 return;      
  124.             }      
  125.             sortedArray[this.nverts-1]=nodelist[currentNode].getBs();      
  126.             deleteNode(currentNode);      
  127.         }      
  128.         for(int j=0;j<orig_nverts;j++){      
  129.             System.out.print(sortedArray[j]);      
  130.         }      
  131.     }      
  132.           
  133.     private void deleteNode(int delVert){      
  134.         if(delVert!=this.nverts-1){      
  135.             for(int j=delVert;j<this.nverts-1;j++)      
  136.                 this.nodelist[j]=this.nodelist[j+1];      
  137.             for(int row=delVert;row<this.nverts-1;row++)      
  138.                 moveRowUp(row,this.nverts);      
  139.             for(int col=delVert;col<this.nverts-1;col++)      
  140.                 moveRowLeft(col,this.nverts-1);      
  141.         }      
  142.         this.nverts--;            
  143.     }      
  144.     private void moveRowUp(int row,int length){      
  145.         for(int col=0;col<length;col++)      
  146.             adjMat[row][col]=adjMat[row+1][col];      
  147.     }      
  148.           
  149.     private void moveRowLeft(int col,int length){      
  150.         for(int row=0;row<length;row++)      
  151.             adjMat[row][col]=adjMat[row][col+1];          
  152.     }      
  153.      
  154.     public void displayNode(int v){      
  155.         System.out.println(nodelist[v].getBs().toString());      
  156.     }      
  157.           
  158.     public static void main(String[] args) {      
  159.         Graph g=new Graph();      
  160.         g.addNode(new Node(new BusSiteBean("A")));      
  161.         g.addNode(new Node(new BusSiteBean("B")));      
  162.         g.addNode(new Node(new BusSiteBean("C")));      
  163.         g.addNode(new Node(new BusSiteBean("D")));      
  164.         g.addNode(new Node(new BusSiteBean("E")));      
  165.         g.addNode(new Node(new BusSiteBean("F")));      
  166.         g.addNode(new Node(new BusSiteBean("G")));      
  167.         g.addNode(new Node(new BusSiteBean("H")));      
  168.               
  169.         g.addEdge(03);      
  170.         g.addEdge(04);      
  171.         g.addEdge(14);      
  172.         g.addEdge(25);      
  173.         g.addEdge(36);      
  174.         g.addEdge(46);      
  175.         g.addEdge(57);      
  176.         g.addEdge(67);      
  177.               
  178.         g.poto();      
  179.     }      
  180. }    

你可能感兴趣的:(算法,F#,J#)