算法.JS.2.算法

124 阅读1分钟

图和图算法-

  • 图和图算法-边的集合和定点的集合组成;
  • 顶点有权重-成本; 顶点有序-向图;
  • 图是无序的-无序图或无向图;
  • 一个节点到另一个节点-路径;
  • 指向本身顶点路径-环;
  • 至少有一条路径-圈;
  • 圈中无重复顶点-简单圈;
  • 有重复顶点-平凡圈;
  • 两个顶点之间有路径-强连通;
  • 深度优先搜索,广度优先搜索;
function Graph(v) {
  this.vertices = v; // 顶点的个数
  this.edges = 0; // 边条数
  this.adj = []; // 连接表
  this.marked = []; // 2-是否已访问过的节点
  // 创建二维数组
  for (var i = 0; i < this.vertices; i++) {
    this.adj[i] = []; // 每个顶点开辟一个数组
    this.marked[i] = false; // 2-是否已访问过的节点
  }
  this.addEdge = addEdge; // 操作边数量
  this.showGraph = showGraph;
  this.dfs = dfs; // 深度优先遍历
  this.bfs = bfs; // 广度优先遍历
  this.edgeTo = []; // 最短路径所有边
  this.hasPathTo = hasPathTo; // 有没有路径
  this.pathTo = pathTo; // 最短路径
}
function addEdge(v, w) {
  this.adj[v].push(w);
  this.adj[w].push(v);
  this.edges++; // 对边进行加1操作
}
function showGraph() {
  for (var i = 0; i < this.vertices; i++) {
    var edges = "";
    for (var j = 0; j < this.vertices; j++) {
      if (this.adj[i][j]) {
        edges += this.adj[i][j] + " ";
      }
    }
    console.log(i + "->" + edges);
  }
}
function dfs(v) {
  this.marked[v] = true;
  if (this.adj[v] != undefined) {
    console.log(v + "【节点已经被访问】");
  }
  for (const w in this.adj[v]) {
    var current = this.adj[v][w];
    if (!this.marked[current]) {
      this.dfs(current);
    }
  }
}
function bfs(s) {
  var queue = [];
  this.marked[s] = true; // 标记已访问
  queue.push(s);
  while (queue.length > 0) {
    var v = queue.shift();
    if (v != undefined) {
      console.log("[bfs]" + v + "【节点已被访问】");
    }
    for (var w in this.adj[v]) {
      var current = this.adj[v][w];
      if (!this.marked[current]) {
        this.marked[current] = true;
        this.edgeTo[current] = v;
        queue.push(current);
      }
    }
  }
}
function hasPathTo(v) {
  return this.marked[v];
}
function pathTo(v) {
  var source = 0;
  if (!this.hasPathTo(v)) {
    return undefined;
  }
  var path = [];
  for (var i = v; i != source; i = this.edgeTo[i]) {
    path.push(i);
  }
  path.push(source);
  return path;
}
var g = new Graph(5);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(2, 4);
g.showGraph();
// g.dfs(0);
g.bfs(0);
var paths = g.pathTo(4);
var str = "";
while (paths.length > 0) {
  if (paths.length > 1) {
    str += paths.pop() + "->";
  } else {
    str += paths.pop();
  }
}
console.log(str);