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

题目:
在这里插入图片描述
在这里插入图片描述

解题思路:
在这里插入图片描述

解题代码:

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)
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值