基础算法题(2) - 树和图

  1. T1(508C)
    Examples
    input
    4 1
    1 1 0 0
    1 2
    1 3
    1 4
    output
    2
    input
    7 1
    1 0 1 1 0 0 0
    1 2
    1 3
    2 4
    2 5
    3 6
    3 7
    output
    2

第一行n, k为节点个数,和最大容忍值
第二行n个数,为第i个节点有没有猫
后面n-1行,x,y 表示节点x和y有连接
从节点1出发,问到达叶子节点,且路上连续遇到猫个数步超过k

1.构建树结构
2.从1出发,若连续遇到多余k只猫,此路不同
3.到达叶子节点且连续遇到猫步超过k,ans++
4.dfs遍历每条路

代码(GO):

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

type tree_node struct {
    children [](*tree_node)
    value    int
}

func visit(root, parent *tree_node, m, cur int, ans *int) {
    if cur > m {
        return
    }
    if len(root.children) == 1 && root.children[0] == parent {
        *ans++
        return
    }

    for i := 0; i < len(root.children); i++ {
        if root.children[i] != parent {
            if root.children[i].value == 0 {
                visit(root.children[i], root, m, 0, ans)
            } else {
                visit(root.children[i], root, m, 1+cur, ans)
            }
        }
    }
}

func main() {
    var n, m int
    fmt.Scan(&n, &m)

    nodes := make([]tree_node, n+1, n+1)
    bs := bufio.NewScanner(os.Stdin)
    bs.Split(bufio.ScanWords)
    for i := 1; i <= n; i++ {
        bs.Scan()
        nodes[i].value, _ = strconv.Atoi(bs.Text())
    }

    for i := 1; i < n; i++ {
        bs.Scan()
        p, _ := strconv.Atoi(bs.Text())
        bs.Scan()
        c, _ := strconv.Atoi(bs.Text())

        nodes[p].children = append(nodes[p].children, &nodes[c])
        nodes[c].children = append(nodes[c].children, &nodes[p])
    }

    ans := 0
    visit(&nodes[1], nil, m, nodes[1].value, &ans)
    fmt.Println(ans)
}
  1. T2

  2. T3

  3. T4

  4. T5

  5. T6

  6. T7

  7. T8

  8. T9

  9. T10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值