-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathgraph-base.js
159 lines (145 loc) · 3.7 KB
/
graph-base.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Base class for Graph and Edge objects
//
/**LinkedList for an edge
* Initialises an Edge which stores data
* and pointer to the next Edge
* Defaults to null
*/
class Edge {
/**
* Class for creating an edge which is an
* object containing src, dest and weight
*/
constructor() {
this.src = null;
this.dest = null;
this.weight = null;
}
}
Edge.prototype.inspect = function () {
return ` [src : ${this.src} dest: ${this.dest} weight:${this.weight} ]`;
};
class GraphBase {
/**
*
* @param {integer} numVertices
* @param {integer} numEdges
*
* This class stores a graph object
* having v vertices and e edges
* There is adjacency list to store
* all the corresponding Edge object
* This implements an undirected graph
* For directed graph the addEdge needs
* to be overloaded
*/
constructor(numVertices = 0) {
this.numVertices = numVertices;
this.adj = new Map();
// this.Adj = this.getSimpleAdj()
}
/**
*
* @param {Array} vertex
* Function to add the total vertex in a graph
* Stores a map in which each vertex points to all other vertices
*/
addVertex(vertex) {
this.adj.set(vertex, []);
}
/**
*
* @param {integer} vertices1
* @param {integer} vertices2
* @param {integer} weight
*
* Attach an edge to the adjacency list
* Uses a weighted and directed graph
*/
addEdge(vertices1, vertices2, weight) {
const edge1 = new Edge();
edge1.src = vertices1;
edge1.dest = vertices2;
edge1.weight = weight;
this.adj.get(vertices1).push(edge1);
}
getSimpleAdj() {
let Adj = new Map();
let mp = this.adj;
// console.log(this.adj)
// Object.assign(mp, this.adj)
// console.log(mp)
mp.forEach(function (value, key) {
// console.log("K"+key+"V"+value)
Adj.set(key, []);
});
// console.log(mp)
mp.forEach(function (value, key) {
// value = ;
// console.log(mp[key]);
// Adj.set(key, [])
// console.log(value)
for (let i = 0; i < value.length; i++) {
let val = value[i];
Adj.get(val.src).push(val.dest);
// Adj.get(val.dest).push(val.src)
}
// value.forEach((val) => {
// console.log(Adj.get(val))
// Adj.get(val.src).push(val.dest)
// Adj.get(val.dest).push(val.src)
// })
});
// console.log(Adj)
this.Adj = Adj;
return Adj;
}
// An adjacency list for a transpose graph
getTransposeAdj() {
let Adj = new Map();
let mp = this.adj;
// console.log(this.adj)
// Object.assign(mp, this.adj)
// console.log(mp)
mp.forEach(function (value, key) {
// console.log("K"+key+"V"+value)
Adj.set(key, []);
});
// console.log(mp)
mp.forEach(function (value, key) {
// value = ;
// console.log(mp[key]);
// Adj.set(key, [])
// console.log(value)
for (let i = 0; i < value.length; i++) {
let val = value[i];
Adj.get(val.dest).push(val.src);
// Adj.get(val.dest).push(val.src)
}
// value.forEach((val) => {
// console.log(Adj.get(val))
// Adj.get(val.src).push(val.dest)
// Adj.get(val.dest).push(val.src)
// })
});
// console.log(Adj)
this.Adj = Adj;
return Adj;
}
}
// const graph = new GraphBase(4)
// vertices = [0,1,2,3]
// for(let i=0;i<vertices.length;i++)
// {
// graph.addVertex(vertices[i])
// }
// // console.log(graph.adj.get(v[0]).push(9))
// graph.addEdge(0 ,1 , 5);
// graph.addEdge(0,2,4)
// // // console.log(graph)
// graph.addEdge(1 ,2 , 4);
// // // console.log(graph)
// graph.addEdge(2 ,3 , 3);
// graph.addEdge(3 ,0 , 2);
// console.log(graph.getSimpleAdj())
module.exports = GraphBase;