File tree Expand file tree Collapse file tree 4 files changed +29
-29
lines changed
Depth-First Search/DepthFirstSearch.playground
Pages/Simple Example.xcplaygroundpage Expand file tree Collapse file tree 4 files changed +29
-29
lines changed Original file line number Diff line number Diff line change @@ -5,15 +5,15 @@ print("Hello, Swift 4!")
5
5
#endif
6
6
7
7
func depthFirstSearch( _ graph: Graph , source: Node ) -> [ String ] {
8
- var nodesExplored = [ source. label]
9
- source. visited = true
10
-
11
- for edge in source. neighbors {
12
- if !edge. neighbor. visited {
13
- nodesExplored += depthFirstSearch ( graph, source: edge. neighbor)
8
+ var nodesExplored = [ source. label]
9
+ source. visited = true
10
+
11
+ for edge in source. neighbors {
12
+ if !edge. neighbor. visited {
13
+ nodesExplored += depthFirstSearch ( graph, source: edge. neighbor)
14
+ }
14
15
}
15
- }
16
- return nodesExplored
16
+ return nodesExplored
17
17
}
18
18
19
19
let graph = Graph ( )
Original file line number Diff line number Diff line change 1
1
public class Edge : Equatable {
2
- public var neighbor : Node
3
-
4
- public init ( _ neighbor: Node ) {
5
- self . neighbor = neighbor
6
- }
2
+ public var neighbor : Node
3
+
4
+ public init ( _ neighbor: Node ) {
5
+ self . neighbor = neighbor
6
+ }
7
7
}
8
8
9
9
public func == ( _ lhs: Edge , rhs: Edge ) -> Bool {
10
- return lhs. neighbor == rhs. neighbor
10
+ return lhs. neighbor == rhs. neighbor
11
11
}
Original file line number Diff line number Diff line change 1
1
public class Graph : CustomStringConvertible , Equatable {
2
2
public private( set) var nodes : [ Node ]
3
-
3
+
4
4
public init ( ) {
5
5
self . nodes = [ ]
6
6
}
7
-
7
+
8
8
public func addNode( _ label: String ) -> Node {
9
9
let node = Node ( label)
10
10
nodes. append ( node)
11
11
return node
12
12
}
13
-
13
+
14
14
public func addEdge( _ source: Node , neighbor: Node ) {
15
15
let edge = Edge ( neighbor)
16
16
source. neighbors. append ( edge)
17
17
}
18
-
18
+
19
19
public var description : String {
20
20
var description = " "
21
-
21
+
22
22
for node in nodes {
23
23
if !node. neighbors. isEmpty {
24
24
description += " [node: \( node. label) edges: \( node. neighbors. map { $0. neighbor. label} ) ] "
25
25
}
26
26
}
27
27
return description
28
28
}
29
-
29
+
30
30
public func findNodeWithLabel( _ label: String ) -> Node {
31
31
return nodes. filter { $0. label == label } . first!
32
32
}
33
-
33
+
34
34
public func duplicate( ) -> Graph {
35
35
let duplicated = Graph ( )
36
-
36
+
37
37
for node in nodes {
38
38
duplicated. addNode ( node. label)
39
39
}
40
-
40
+
41
41
for node in nodes {
42
42
for edge in node. neighbors {
43
43
let source = duplicated. findNodeWithLabel ( node. label)
44
44
let neighbour = duplicated. findNodeWithLabel ( edge. neighbor. label)
45
45
duplicated. addEdge ( source, neighbor: neighbour)
46
46
}
47
47
}
48
-
48
+
49
49
return duplicated
50
50
}
51
51
}
Original file line number Diff line number Diff line change 1
1
public class Node : CustomStringConvertible , Equatable {
2
2
public var neighbors : [ Edge ]
3
-
3
+
4
4
public private( set) var label : String
5
5
public var distance : Int ?
6
6
public var visited : Bool
7
-
7
+
8
8
public init ( _ label: String ) {
9
9
self . label = label
10
10
neighbors = [ ]
11
11
visited = false
12
12
}
13
-
13
+
14
14
public var description : String {
15
15
if let distance = distance {
16
16
return " Node(label: \( label) , distance: \( distance) ) "
17
17
}
18
18
return " Node(label: \( label) , distance: infinity) "
19
19
}
20
-
20
+
21
21
public var hasDistance : Bool {
22
22
return distance != nil
23
23
}
24
-
24
+
25
25
public func remove( _ edge: Edge ) {
26
26
neighbors. remove ( at: neighbors. index { $0 === edge } !)
27
27
}
You can’t perform that action at this time.
0 commit comments