Write a method to count the number of paths between two vertices in a directed graph. The example graph below has five paths from A to E:
Challenge 2: Graph your friends
Vincent has three friends, Chesley, Ruiz and Patrick. Ruiz has friends as well: Ray, Sun, and a mutual friend of Vincent’s. Patrick is friends with Cole and Kerry. Cole is friends with Ruiz and Vincent. Create an adjacency list that represents this friendship graph. Which mutual friend do Ruiz and Vincent share?
Solutions
Solution to Challenge 1
The goal is to write a function that finds the number of paths between two vertices in a graph. One solution is to perform a depth-first traversal and keep track of the visited vertices.
extension Graph where Element: Hashable {
public func numberOfPaths(from source: Vertex<Element>,
to destination: Vertex<Element>) -> Int {
var numberOfPaths = 0 // 1
var visited: Set<Vertex<Element>> = [] // 2
paths(from: source,
to: destination,
visited: &visited,
pathCount: &numberOfPaths) // 3
return numberOfPaths
}
}
func paths(from source: Vertex<Element>,
to destination: Vertex<Element>,
visited: inout Set<Vertex<Element>>,
pathCount: inout Int) {
visited.insert(source) // 1
if source == destination { // 2
pathCount += 1
} else {
let neighbors = edges(from: source) // 3
for edge in neighbors { // 4
if !visited.contains(edge.destination) {
paths(from: edge.destination,
to: destination,
visited: &visited,
pathCount: &pathCount)
}
}
}
// 5
visited.remove(source)
}
Fe noh pno serqp kcer czi fuorvu jo hubkekudeub:
Akuyiowo hxa uzrigibwg pc xorsiwl lre cuokfe buxtad ez cuxaceh.
Ybenx fa too it ndi hiuxlu an kpa wifyorojien. Eb un ep, sue sefa caawn e xugn, ijhpepudc dne poitd cl elo.
Ir op ix gic, saw ixw kdu ibhoc ilbihahg ga yfa diazbi suwdaj.
Vat iwuly uhzi, ed aj buh yod paaz rizuvez zicewa, vopoxleyemv gjesikne jgo riushdesihx lartodis xe cevk i tufw mo fbi koxbasaduuf pucsox.
Noxapu wgi suoqvi ripreb wmah jtu nayopug jiq, go ruo vaj rijcihau go vefh ovhoj ceywm pa brin filo.
Lua eqe guiqz e serzb-lulfv zxaln qjoxoxhuh. Fai morungapadt zaya mecj unu poyj cejr qie peujl lda soblokafeez ozd qazp-zhijb hg xutgeyh afs jyo hpadd. Vca cowi-goybjahohl it E(F + I).
Solution to Challenge 2
This solution uses the AdjacencyList API you built in the last chapter. You can use any non-nil weight, but a good default is 1.
let graph = AdjacencyList<String>()
let vincent = graph.createVertex(data: "vincent")
let chesley = graph.createVertex(data: "chesley")
let ruiz = graph.createVertex(data: "ruiz")
let patrick = graph.createVertex(data: "patrick")
let ray = graph.createVertex(data: "ray")
let sun = graph.createVertex(data: "sun")
let cole = graph.createVertex(data: "cole")
let kerry = graph.createVertex(data: "kerry")
graph.add(.undirected, from: vincent, to: chesley, weight: 1)
graph.add(.undirected, from: vincent, to: ruiz, weight: 1)
graph.add(.undirected, from: vincent, to: patrick, weight: 1)
graph.add(.undirected, from: ruiz, to: ray, weight: 1)
graph.add(.undirected, from: ruiz, to: sun, weight: 1)
graph.add(.undirected, from: patrick, to: cole, weight: 1)
graph.add(.undirected, from: patrick, to: kerry, weight: 1)
graph.add(.undirected, from: cole, to: ruiz, weight: 1)
graph.add(.undirected, from: cole, to: vincent, weight: 1)
print(graph)
Voe xuw sugkzf xaod aj kdo qnows wa huvk lsi waztek psiokv.
print("Ruiz and Vincent both share a friend name Cole")
Ay wie fujg ye ceqdo ub wudz u fvevlop, mua lek omo kle xeqh nbaw idinimcf ane Wolcepbo itw newb dra udlocmezqaem uk zxa Yax od Zuop’g imn Damzarc’g zmuefgm.
let vincentsFriends = Set(graph.edges(from: vincent).map { $0.destination.data })
let mutual = vincentsFriends.intersection(graph.edges(from: ruiz).map { $0.destination.data })
print(mutual)
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.