• JavaScript数据结构-17.图结构


      1 <!DOCTYPE html>
      2 <html>
      3     <head>
      4         <meta charset="UTF-8">
      5         <title>图的实现</title>
      6     </head>
      7     <body>        
      8       <script type="text/javascript">
      9     
     10         function Graph(v){
     11             this.vertices = v;
     12             this.edges = 0;
     13             this.adj = [];
     14             for(var i = 0; i<this.vertices;i++){
     15                 this.adj[i] = [];
     16                 // 原书有这句,多余  没什么用。
     17 //                this.adj[i].push("");
     18             }
     19             this.addEdge = addEdge;
     20             this.toString = toString;
     21             this.showGraph = showGraph;
     22             
     23             //记录已经访问过的顶点
     24             this.marked = [];
     25             for(var i = 0;i < this.vertices;i++){
     26                 this.marked[i] = false;
     27             }
     28             this.dfs = dfs;
     29             this.bfs = bfs;        
     30         }
     31         function addEdge(v,w){
     32             this.adj[v].push(w);
     33             this.adj[w].push(v);
     34             this.edges++;
     35         }
     36         
     37         function showGraph(){
     38             for(var i =0;i < this.vertices;i++){
     39                 for(var j = 0;j < this.vertices;j++){
     40                     if(this.adj[i][j] != undefined){
     41                         console.log(i+"->"+this.adj[i][j])
     42                     }
     43                 }
     44             }
     45         }
     46         //深度优先搜索
     47         function dfs(v){
     48             this.marked[v] = true;
     49             //输出一下 
     50             if(this.adj[v] != undefined){
     51                 console.log("已访问 :"+v);
     52                 console.log(this.marked,"adj")
     53             }
     54             //原书写法   这里用for in 得到的只是顶点的索引,并且会把非整数索引也循环,这里有坑
     55             /*
     56             for (var w in this.adj[v] ){            
     57                 if(!this.marked[this.adj[v][w]]){
     58                     this.dfs(this.adj[v][w]);
     59                 }
     60             }
     61             */
     62 
     63            for(var i = 0;i<this.adj[v].length;i++){
     64                    var w = this.adj[v][i];
     65                    if(!this.marked[w]){
     66                     console.log("123456")
     67                     this.dfs(w);
     68                   }
     69             }
     70         }                
     71         //广度优先
     72         function bfs(s){
     73             var queue = [];
     74             this.marked[s] = true;
     75             queue.push(s);
     76             while(queue.length > 0){
     77                 var v = queue.shift();
     78                 if(v != undefined){
     79                     console.log("已访问 :"+v);
     80                 }
     81                 for(var k in this.adj[v]){            
     82                     var w = this.adj[v][k];
     83                     if(!this.marked[w]){
     84                         this.marked[w] = true;
     85                         queue.push(w);
     86                     }
     87                 }
     88             }        
     89         }
     90         
     91         var obj = new Graph(5);
     92         obj.addEdge(0,1);
     93         obj.addEdge(0,2);
     94         obj.addEdge(1,3);
     95         obj.addEdge(2,4);
     96         obj.showGraph();
     97         //深度优先搜索
     98 //        obj.dfs(0);
     99         console.log("------------")
    100         obj.bfs(0);
    101         
    102         
    103         //由于标记数组定义在对象里  所以在这儿不能同时调用深度优先和广度优先。。
    104      </script>
    105     </body>
    106 </html>
  • 相关阅读:
    SQL Server 与 Entity Framework 级联删除
    web api 2 学习笔记 (Odata ODataQueryOptions 使用)
    【建议收藏】设计师必备-史上最全的个人资料页面设计模板下载
    浅谈产品经理入门和学习路径
    最全面!2019年最新UX设计趋势预测合集
    最新Dashboard设计实例、技巧和资源集锦,视觉和功能两不误,妥妥的!
    【技巧分享】设计师如何向开发人员顺利交付作品?
    摹客iDoc201901-2新功能点评
    企业类Web原型制作分享-Kraftwerk
    【新年福利】2019年值得一用的8款协作工具
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7191930.html
Copyright © 2020-2023  润新知