图论Graph Theory:使用JS实现图的结构

前置知识:

图论Graph Theory:福尔福特森算法 Ford-Fulkerson_董厂长的博客-CSDN博客图论Graph Theory:关于图论的基础adjacency matrix/List 构造最小生成树-普里姆算法 克鲁斯卡尔算法_董厂长的博客-CSDN博客

在实现过程中采用邻接表Adjacency List的方式来表示边,使用字典类map来存储邻接表。JAVA中貌似用的是散列表,不会,就用js的map吧

一般V代表点,E代表边。

//封装图类
function Graph() {
  //属性:顶点(数组)/边(字典)
  this.vertexes = []; //顶点
  this.edges = new Map(); //边
}

创建一个数组对象vertexes存储图的顶点;创建一个map对象edges存储图的边,其中key为顶点,value为存储key顶点相邻顶点的数组。

举个例子:

const fuckEdgeMap = new Map();

fuckEdgeMap.set(Ea, [a,b]);//代表这个边Ea链接 a b两个点

 实现其内部方法:

//一.添加顶点
Graph.prototype.addVertex = function (v) {
  this.vertexes.push(v);
  //将边添加到字典中,新增的顶点作为键,对应的值为一个存储边的空数组
  this.edges.set(v, []);
};
//二.添加边
Graph.prototype.addEdge = function (v1, v2) {
  //传入两个顶点连成一条边
  this.edges.get(v1).push(v2); //取出字典对象edges中存储边的数组,并添加关联顶点
  this.edges.get(v2).push(v1); //表示的是无向表,故要添加互相指向的两条边
};

 转化为字符串输出

 //三.实现toString方法:转换为邻接表形式
 Graph.prototype.toString = function () {
  //1.定义字符串,保存最终结果
  let resultString = ""
  //2.遍历所有的顶点以及顶点对应的边
  for (let i = 0; i < this.vertexes.length; i++) {//遍历所有顶点
      resultString += this.vertexes[i] + '-->  '
      let vEdges = this.edges.get(this.vertexes[i])
      for (let j = 0; j < vEdges.length; j++) {//遍历字典中每个顶点对应的数组
          resultString += vEdges[j] + ' ';
      }
      resultString += '\n'
  }
  return resultString
}

 测试代码

//测试代码
//1.创建图结构
let graph = new Graph();
​
//2.添加顶点
let myVertexes = ["A", "B", "C", "D", "E", "F", "G", "H", "I"];
for (let i = 0; i < myVertexes.length; i++) {
  graph.addVertex(myVertexes[i]);
}
​
//3.添加边
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("A", "D");
graph.addEdge("C", "D");
graph.addEdge("C", "G");
graph.addEdge("D", "G");
graph.addEdge("D", "H");
graph.addEdge("B", "E");
graph.addEdge("B", "F");
graph.addEdge("E", "I");
console.log(graph.toString());

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值