FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
JavaScriptAlgorithms/Graphs/Kosaraju.js at master · bachdx2812/JavaScriptAlgorithms · GitHub
bachdx2812
/
JavaScriptAlgorithms
Public
forked from
TheAlgorithms/JavaScript
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
JavaScriptAlgorithms
/
Graphs
/
Kosaraju.js
Copy path
More file actions
More file actions
Latest commit
History
History
History
100 lines (89 loc) · 2.63 KB
Breadcrumbs
JavaScriptAlgorithms
/
Graphs
/
Kosaraju.js
Copy path
File metadata and controls
100 lines (89 loc) · 2.63 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
/**
* Author: Adrito Mukherjee
* Kosaraju's Algorithm implementation in Javascript
* Kosaraju's Algorithm finds all the connected components in a Directed Acyclic Graph (DAG)
* It uses Stack data structure to store the Topological Sorted Order of vertices and also Graph data structure
*
* Wikipedia: https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm
*
*/
class
Kosaraju
{
constructor
(
graph
)
{
this
.
connections
=
{
}
this
.
reverseConnections
=
{
}
this
.
stronglyConnectedComponents
=
[
]
for
(
const
[
i
,
j
]
of
graph
)
{
this
.
addEdge
(
i
,
j
)
}
this
.
topoSort
(
)
return
this
.
kosaraju
(
)
}
addNode
(
node
)
{
// Function to add a node to the graph (connection represented by set)
this
.
connections
[
node
]
=
new
Set
(
)
this
.
reverseConnections
[
node
]
=
new
Set
(
)
this
.
topoSorted
=
[
]
}
addEdge
(
node1
,
node2
)
{
// Function to add an edge (adds the node too if they are not present in the graph)
if
(
!
(
node1
in
this
.
connections
)
||
!
(
node1
in
this
.
reverseConnections
)
)
{
this
.
addNode
(
node1
)
}
if
(
!
(
node2
in
this
.
connections
)
||
!
(
node2
in
this
.
reverseConnections
)
)
{
this
.
addNode
(
node2
)
}
this
.
connections
[
node1
]
.
add
(
node2
)
this
.
reverseConnections
[
node2
]
.
add
(
node1
)
}
dfsTopoSort
(
node
,
visited
)
{
visited
.
add
(
node
)
for
(
const
child
of
this
.
connections
[
node
]
)
{
if
(
!
visited
.
has
(
child
)
)
this
.
dfsTopoSort
(
child
,
visited
)
}
this
.
topoSorted
.
push
(
node
)
}
topoSort
(
)
{
// Function to perform topological sorting
const
visited
=
new
Set
(
)
const
nodes
=
Object
.
keys
(
this
.
connections
)
.
map
(
(
key
)
=>
Number
(
key
)
)
for
(
const
node
of
nodes
)
{
if
(
!
visited
.
has
(
node
)
)
this
.
dfsTopoSort
(
node
,
visited
)
}
}
dfsKosaraju
(
node
,
visited
)
{
visited
.
add
(
node
)
this
.
stronglyConnectedComponents
[
this
.
stronglyConnectedComponents
.
length
-
1
]
.
push
(
node
)
for
(
const
child
of
this
.
reverseConnections
[
node
]
)
{
if
(
!
visited
.
has
(
child
)
)
this
.
dfsKosaraju
(
child
,
visited
)
}
}
kosaraju
(
)
{
// Function to perform Kosaraju Algorithm
const
visited
=
new
Set
(
)
while
(
this
.
topoSorted
.
length
>
0
)
{
const
node
=
this
.
topoSorted
.
pop
(
)
if
(
!
visited
.
has
(
node
)
)
{
this
.
stronglyConnectedComponents
.
push
(
[
]
)
this
.
dfsKosaraju
(
node
,
visited
)
}
}
return
this
.
stronglyConnectedComponents
}
}
function
kosaraju
(
graph
)
{
const
stronglyConnectedComponents
=
new
Kosaraju
(
graph
)
return
stronglyConnectedComponents
}
export
{
kosaraju
}
// kosaraju([
// [1, 2],
// [2, 3],
// [3, 1],
// [2, 4],
// [4, 5],
// [5, 6],
// [6, 4],
// ])
// [ [ 1, 3, 2 ], [ 4, 6, 5 ] ]
Back
|
FazBrowse Home
|
New Git URL