-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path615.go
98 lines (88 loc) · 1.67 KB
/
615.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
88
89
90
91
92
93
94
95
96
97
98
// UVa 615 - Is It A Tree?
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type edge struct{ n1, n2 int }
func unionFind(x int, f []int) int {
if f[x] != x {
f[x] = unionFind(f[x], f)
}
return f[x]
}
func isTree(edges []edge) bool {
if len(edges) == 0 {
return true
}
var maxNode int
nodeMap := make(map[int]bool)
for _, edge := range edges {
nodeMap[edge.n1], nodeMap[edge.n2] = true, true
maxNode = max(maxNode, max(edge.n1, edge.n2))
}
f := make([]int, maxNode+1)
for k := range nodeMap {
f[k] = k
}
for _, edge := range edges {
if r1, r2 := unionFind(edge.n1, f), unionFind(edge.n2, f); r1 != r2 {
f[r1] = r2
}
}
count := 0
for k := range nodeMap {
if f[k] == k {
if count++; count > 1 {
return false
}
}
}
pointingTo := make(map[int]int)
for _, edge := range edges {
pointingTo[edge.n2]++
if pointingTo[edge.n2] > 1 {
return false
}
}
return len(nodeMap) == len(pointingTo)+1
}
func main() {
in, _ := os.Open("615.in")
defer in.Close()
out, _ := os.Create("615.out")
defer out.Close()
s := bufio.NewScanner(in)
s.Split(bufio.ScanLines)
var e edge
here:
for kase := 1; ; kase++ {
var edges []edge
there:
for s.Scan() {
line := s.Text()
if line == "" {
continue
}
if line[0] == '-' {
break here
}
for r := strings.NewReader(line); ; {
if _, err := fmt.Fscanf(r, "%d%d", &e.n1, &e.n2); err != nil || e.n1 == 0 && e.n2 == 0 {
if e.n1 == 0 && e.n2 == 0 {
break there
}
break
}
edges = append(edges, e)
}
}
if fmt.Fprintf(out, "Case %d ", kase); isTree(edges) {
fmt.Fprintln(out, "is a tree.")
} else {
fmt.Fprintln(out, "is not a tree.")
}
}
}