문제 링크 : 백준 1976번
처음에 BFS로 접근했다가 오답을 받아서 다시 생각해보니 m개로 받은 도시가 모두 연결되어 있지 않으면 무조건 불가능이라는 것을 이용해 union find로 풀 수 있을 것 같았다.
NO
를 출력해주고 그 외의 경우에는 YES
를 출력해준다.⭐ m개의 도시가 모두 연결되어 있다면 root도시는 모두 같아야한다.
package main
import (
"bufio"
"fmt"
"os"
)
var (
r = bufio.NewReader(os.Stdin)
w = bufio.NewWriter(os.Stdout)
n, m int
parent [201]int
)
func find(node int) int {
if node == parent[node] {
return node
}
parent[node] = find(parent[node])
return parent[node]
}
func merge(a int, b int) {
a = find(a)
b = find(b)
if a != b {
if a < b {
a, b = b, a
}
parent[b] = a
}
}
func main() {
defer w.Flush()
fmt.Fscan(r, &n, &m)
for i := 1; i <= n; i++ {
parent[i] = i
}
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
var a int
fmt.Fscan(r, &a)
if a == 1 {
merge(i, j)
}
}
}
var a int
check := true
fmt.Fscan(r, &a)
root := find(a)
for i := 1; i <= m-1; i++ {
fmt.Fscan(r, &a)
if root != find(a) {
check = false
}
}
if check {
fmt.Fprintln(w, "YES")
} else {
fmt.Fprintln(w, "NO")
}
}