54 lines
967 B
Go
54 lines
967 B
Go
|
package unionfind
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func testFile(fileName string, components int, i implementation) {
|
||
|
lines := readByLine(fileName)
|
||
|
count, _ := strconv.Atoi(<-lines)
|
||
|
qf := i.create(count)
|
||
|
|
||
|
for line := range lines {
|
||
|
first, second := pair(line)
|
||
|
if qf.Connected(first, second) {
|
||
|
continue
|
||
|
}
|
||
|
qf.Union(first, second)
|
||
|
}
|
||
|
|
||
|
if components != qf.Count() {
|
||
|
log.Fatalf("%v: Expected components count: %v, got: %v", i.name, components, qf.Count())
|
||
|
}
|
||
|
fmt.Printf("%v: Components: %v\n", i.name, qf.Count())
|
||
|
}
|
||
|
|
||
|
func readByLine(fileName string) <-chan string {
|
||
|
file, _ := os.Open(fileName)
|
||
|
scanner := bufio.NewScanner(file)
|
||
|
line := make(chan string)
|
||
|
|
||
|
go func() {
|
||
|
defer close(line)
|
||
|
for scanner.Scan() {
|
||
|
line <- scanner.Text()
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
return line
|
||
|
}
|
||
|
|
||
|
func pair(str string) (int, int) {
|
||
|
numbers := strings.Split(str, " ")
|
||
|
|
||
|
a, _ := strconv.Atoi(numbers[0])
|
||
|
b, _ := strconv.Atoi(numbers[1])
|
||
|
|
||
|
return a, b
|
||
|
}
|