PAT1 1076 Forwards on Weibo

题目链接
我的github

题目大意

给一个图,然后给 K K K个点,对每个点询问在 L L L步内,有多少点可达(相邻点之间算一步)

输入

每组包含一个测试用例

  • 第一行是两个正整数 N ≤ 1000 N\le1000 N1000表示点的数量, L ≤ 6 L\le6 L6表示步数
  • 之后有 N N N行,每行第一个数字表示这个点相邻点的个数( ≤ 100 \le100 100),后面跟着相邻点的编号(可能会给不全)
  • 然后有一个正数 K K K,表示询问的点的个数,后面跟着 K K K个点的编号

点的编号从 1 1 1~ N N N

输出

对每个用例,输出询问的点在 L L L步内可达点的数量

样例输入

7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6

样例输出

4
5

解析

这题bfs可过,然后应该也可以用diskstra
我的python会超时,不知道有没有不超时的python

# -*- coding: utf-8 -*- 
# @Time : 2019/7/3 15:00 
# @Author : ValarMorghulis 
# @File : 1076.py
class node:
    def __init__(self, id, level):
        self.id = id
        self.level = level


n, l = 0, 0
edge = list()


def bfs(start):
    vis = [False for i in range(n)]
    que = list()
    que.append(start)
    vis[start.id] = True
    cnt = 0
    while que:
        tmp = que.pop(0)
        for i in range(len(edge[tmp.id])):
            if not vis[edge[tmp.id][i]] and tmp.level < l:
                que.append(node(edge[tmp.id][i], tmp.level + 1))
                vis[edge[tmp.id][i]] = True
                cnt += 1
    return cnt


def solve():
    global n, l, edge
    n, l = map(int, input().split())
    edge = [[] for i in range(n)]
    for i in range(n):
        a = list(map(int, input().split()))
        for j in range(1, a[0] + 1):
            edge[a[j] - 1].append(i)
    t = list(map(int, input().split()))
    for i in range(1, t[0] + 1):
        print("%d" % bfs(node(t[i]-1, 0)))


if __name__ == "__main__":
    solve()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值