前置知识:
图论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());