题目大意
给一个图,然后给 K K K个点,对每个点询问在 L L L步内,有多少点可达(相邻点之间算一步)
输入
每组包含一个测试用例
- 第一行是两个正整数 N ≤ 1000 N\le1000 N≤1000表示点的数量, L ≤ 6 L\le6 L≤6表示步数
- 之后有 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()