• JavaScript数据结构-18.图结构广度优先和最短路径


      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             //保存从一个顶点到下一个顶点的所有边
     32             this.edgeTo = [];
     33             
     34             this.pathTo = pathTo;
     35             this.hasPathTo = hasPathTo;
     36             
     37         }
     38         function addEdge(v,w){
     39             this.adj[v].push(w);
     40             this.adj[w].push(v);
     41             this.edges++;
     42         }
     43         
     44         function showGraph(){
     45             for(var i =0;i < this.vertices;i++){
     46                 for(var j = 0;j < this.vertices;j++){
     47                     if(this.adj[i][j] != undefined){
     48                         console.log(i+"->"+this.adj[i][j])
     49                     }
     50                 }
     51             }
     52         }
     53             
     54         //广度优先
     55         function bfs(s){
     56             var queue = [];
     57             this.marked[s] = true;
     58             queue.push(s);
     59             while(queue.length > 0){
     60                 var v = queue.shift();
     61                 if(v != undefined){
     62                     console.log("已访问 :"+v);
     63                 }
     64                 for(var k in this.adj[v]){            
     65                     var w = this.adj[v][k];
     66                     if(!this.marked[w]){
     67                         this.edgeTo[w] = v;
     68                         this.marked[w] = true;
     69                         queue.push(w);
     70                     }
     71                 }
     72             }        
     73         }
     74         
     75         function pathTo(v){
     76             var source = 0;
     77             if(!this.hasPathTo(v)){
     78                 return undefined;
     79             }
     80             var path = [];
     81             for(var i = v;i != source;i=this.edgeTo[i]){
     82                 path.push(i);
     83             }
     84             path.push(source);
     85             return path;
     86         }
     87         function hasPathTo(v){
     88             return this.marked[v];
     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         console.log("------------")
     99         obj.bfs(0);
    100         var paths = obj.pathTo(3);
    101         console.log(paths,"123");
    102         while(paths.length >0){
    103             if(paths.length >1){
    104                 console.log(paths.pop() + "-");
    105             }else{
    106                 console.log(paths.pop());
    107             }
    108         }
    109       //打印结果 0-2-4  表示在这个图中 顶点0到顶点4的距离为2;
    110      </script>
    111     </body>
    112 </html>
  • 相关阅读:
    怎样在ASP.NET中使用VB.NET上传大文件
    准备开始研读petShop
    Documentum常见问题9—导航树的一些常见设置
    [转]CMMI 入门 基本术语:约束、假设、依赖、风险、承诺
    MyEclipse 8.6反编译插件安装
    Documentum常见问题7—为客户化Type类型Import时添加自定义属性
    【自省篇】程序员的十大技术烦恼
    Documentum常见问题10修改特定Type的显示图标
    打发时间的题目,每天做一点
    Documentum常见问题8—限制导航树上的文件夹个数
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7191934.html
Copyright © 2020-2023  润新知