zl程序教程

您现在的位置是:首页 >  其他

当前栏目

每日一题 --- 亲戚[洛谷][Go]

2023-03-14 22:41:05 时间

题目:

image

image

解题思路:

image

解题代码:

package main
import (
    "fmt"
)
var n int
var res []int
func main() {
    var (
        m int
        p int
    )
    fmt.Scan(&n)
    fmt.Scan(&m)
    fmt.Scan(&p)
//  画圈
    res = make([]int,n+1)
    // 初始化关系
    for i := 1; i < n + 1; i++ {
        res[i] = i
    }
    for i := 0; i < m; i++ {
        a := 0
        b := 0
        fmt.Scan(&a)
        fmt.Scan(&b)
        join(a,b)
    }
    //for i := 1; i < n+1; i++ {
    //  fmt.Print(res[i]," ")
    //
    //}
//  检查
    var ps = make([][]int,p)
    for i := 0; i < p; i++ {
        a := 0
        b := 0
        fmt.Scan(&a)
        fmt.Scan(&b)
        ps[i] = append(ps[i],a,b)
    }
    //  如果能在a的关系中找到b就说明a和b有关系
    for i := 0; i < p; i++ {
        if judge(ps[i][0],ps[i][1],ps[i][0]) {
            fmt.Println("YES")
        } else {
            fmt.Println("NO")
        }
    }
}
func join(a,b int) {
    if judge(a,b,a) {
        return
    }
    // 找出a的下个元素
    v := res[a]
    // 找出靠b最近的最后一个元素
    k := find(b,b)
    //fmt.Print(k,"= k",v,"= v")
    res[a] = b
    res[k] = v
}
func find(i,j int) int {
    // fmt.Print(res[i],"")
    if res[i] == j {
        return i
    }
    return find(res[i],j)
}
func judge(a,b,c int) bool {
    //fmt.Print(res[a]," ")
    if res[a] == b {
        return true
    }
    if res[a] == c {
        return false
    }
    return judge(res[a],b,c)
}

image