实现图-邻接表
class Vertex {
constructor(V) {
this.data = V; // 顶点
this.adj = []; // 邻接表数组实现
}
}
// 模拟实现一个无向图的邻接表实现
class UndirectedListGraph {
constructor(size){
this.vertexesList = new Array(size);
this.edges = 0;
this.vertexes = 0;
}
edgeSize() {
return this.edges;
}
vertexesSize() {
return this.vertexes;
}
// 添加顶点
addVertex(vertex) {
this.vertexesList[this.vertexes] = new Vertex(vertex);
this.vertexes++;
}
// 新增一条边
addEdge(from, to, weight = 1) {
const i = this.getPosition(from);
const j = this.getPosition(to);
this.vertexesList[i].adj.push(j);
this.vertexesList[j].adj.push(i);
this.edges++;
}
getPosition(v) {
for(let i = 0; i < this.vertexes; i++) {
if(this.vertexesList[i].data === v) return i;
}
return -1;
}
// 删除一条边
removeEdge(from, to) {
const i = this.getPosition(from);
const j = this.getPosition(to);
this.vertexesList[i].adj.splice(j, 1);
this.vertexesList[j].adj.splice(i, 1);
this.edges--;
}
// 删除一个顶点
removeVertex(v) {
/**
* 删除一个顶点
* 1. 查询顶点V的序号index
* 2. 更新边的个数
* 3. 删除所有邻接点对应的index
* 4. 在数组中删除当前顶点
* 5. 更新顶点的个数
* 6. 更新所有邻接表的序号值大于1的值,将所有大于index的值全部减1
*/
let index = this.getPosition(v);
this.edges = this.edges - this.degree(v);
this.vertexesList[index].adj.map((it, i) =>{
const removeIndex = this.vertexesList[it].adj.findIndex((v) => v === index);
this.vertexesList[it].adj.splice(removeIndex, 1);
})
// // 删除当前的顶点
for(let i = index; i < this.vertexes - 1; i++){
this.vertexesList[i] = this.vertexesList[i + 1];
}
this.vertexes--;
for(let i = 0; i < this.vertexes; i++) {
this.vertexesList[i].adj = this.vertexesList[i].adj.map(it => it > 1 ? it - 1 : it )
}
}
// 某个顶点的度
degree(v) {
return this.vertexesList[this.getPosition(v)].adj.length;
}
// 显示图
displayGraph() {
console.log('这是一个无向图,邻接表存储的图');
console.log('顶点信息', this.vertexesList);
for(let i = 0; i < this.vertexes; i++) {
console.log(this.vertexesList[i].data);
console.log(`邻接表: ${this.vertexesList[i].adj}`)
}
}
}
const graph = new UndirectedListGraph(10);
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addVertex('E');
graph.addVertex('F');
console.log(graph, 'graph')
graph.addEdge('A', 'B');
graph.addEdge('A', 'D');
graph.addEdge('B', 'C');
graph.addEdge('B', 'E');
graph.addEdge('C', 'D');
graph.addEdge('C', 'F');
graph.addEdge('D', 'F');
graph.addEdge('E', 'F');
graph.displayGraph()
graph.removeVertex('B');
graph.displayGraph()
console.log(graph.degree('C'), '----')
相关文章
暂无评论...