-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain1.go
87 lines (73 loc) · 1.51 KB
/
main1.go
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
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type Graph map[string]map[string]struct{}
func (g Graph) Link(a, b string) {
if _, ok := g[a]; !ok {
g[a] = make(map[string]struct{})
}
g[a][b] = struct{}{}
if _, ok := g[b]; !ok {
g[b] = make(map[string]struct{})
}
g[b][a] = struct{}{}
}
func (g Graph) Unlink(a, b string) {
delete(g[a], b)
delete(g[b], a)
}
func (g Graph) Dot() string {
sb := strings.Builder{}
sb.WriteString("graph G {\n")
for a := range g {
for b := range g[a] {
sb.WriteString(fmt.Sprintf("\t%s -- %s\n", a, b))
}
}
sb.WriteString("}\n")
return sb.String()
}
func parse() Graph {
g := Graph{}
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
ff := strings.Split(line, ":")
left := ff[0]
right := strings.Fields(ff[1])
for _, r := range right {
g.Link(left, r)
}
}
return g
}
func main() {
g := parse()
// Uncomment the following line to print the .dot file.
//fmt.Println(g.Dot())
// Use `neato -T png graph.dot >graph.png`
// to generate the image included in the dir.
g.Unlink("vps", "pzc")
g.Unlink("xvk", "sgc")
g.Unlink("dph", "cvx")
fmt.Println(bfs(g, "vps") * bfs(g, "pzc"))
}
func bfs(g Graph, start string) int {
visited := map[string]struct{}{}
toDo := []string{start}
var curr string
for len(toDo) > 0 {
curr, toDo = toDo[0], toDo[1:]
for node := range g[curr] {
if _, ok := visited[node]; !ok {
visited[node] = struct{}{}
toDo = append(toDo, node)
}
}
}
return len(visited)
}