首页 > 试题广场 >

小A最多会新认识的多少人

[编程题]小A最多会新认识的多少人
  • 热度指数:5846 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

A参加了一个n人的活动,每个人都有一个唯一编号i(i>=0 & i<n),其中m对相互认识,在活动中两个人可以通过互相都认识的一个人介绍认识。现在问活动结束后,小A最多会认识多少人?


输入描述:
第一行聚会的人数:n(n>=3 & n<10000);
第二行小A的编号: ai(ai >= 0 & ai < n);
第三互相认识的数目: m(m>=1 & m
< n(n-1)/2);
第4到m+3行为互相认识的对,以','分割的编号。


输出描述:
输出小A最多会新认识的多少人?
示例1

输入

7
5
6
1,0
3,1
4,1
5,3
6,1
6,5

输出

3
能新认识的人数是 从A能到达的人的数量 减去已经认识的人数
class Node(object):
    def __init__(self, v):
        self.v = v
        self.neighbors = []

def solve(graph, target):
    counter = 0
    n = len(graph)
    visited = [False for _ in  range(n)]
    stack = [target]
    visited[target] = True
    while stack:
        v = stack.pop()
        for i in graph[v].neighbors:
            if not visited[i]:
                visited[i] = True
                counter += 1
                stack.append(i)
    return counter
                

while True:
    try:
        num_person = int(input().strip())
        target = int(input().strip())
        graph = [Node(i) for i in range(num_person)]
        num_edge = int(input().strip())
        for _ in range(num_edge):
            li = input().strip().split(',')
            i, j = [int(_) for _ in li]
            graph[i].neighbors.append(j)
            graph[j].neighbors.append(i)
        ans = 0
        nei_num = len(graph[target].neighbors)
        if nei_num:
            ans = solve(graph, target) - nei_num
        print(ans)
    except Exception as e:
        #print(e)
        break


发表于 2020-09-04 00:02:38 回复(0)
广度优先算法,用双向队列储存成员
from collections import deque # 双向队列,速度比list更快一些

n = int(input())
ai = int(input())
m = int(input()) # 用整型而不是字符串,能省一点是一点
relationships = {} # 用dict来模拟链表

for i in range(n):
    relationships[i] = []

for _ in range(m):
    member1, member2 = list(map(int, input().split(',')))
    relationships[member1].append(member2)
    relationships[member2].append(member1) # 双向关系

visited = [False]*n # 列表记录成员是否被访问过
visited[ai] = True
for member in relationships[ai]:
    visited[member] = True

queue = deque(relationships[ai])
count = 0
while queue:
    node = queue.popleft()
    for node_next in relationships[node]:
        if not visited[node_next]:
            queue.append(node_next)
            visited[node_next] = True
            count += 1

print(count)
发表于 2020-08-05 19:56:55 回复(0)

分析

  • 通过dict存储图的边信息,每个key对应一个list
  • 然后通过BFS遍历,通过visited标记是否访问过。
#deque pop(0)速度要更快一点
from collections import deque

N = int(input())
cur_id = int(input())
M = int(input())

graph_link_dict = {}
for i in range(N):
    graph_link_dict[i] = []
for _ in range(M):
    node1,node2 = list(map(int,input().split(',')))
    graph_link_dict[node1].append(node2)
    graph_link_dict[node2].append(node1)

visited = [False]*N
new_set = set()

queue = deque()
for node in graph_link_dict[cur_id]:
    queue.append(node)
#BFS
while queue:
    node = queue.popleft()
    if visited[node]:
        continue
    for to_node in graph_link_dict[node]:
        if to_node != cur_id:
            queue.append(to_node)
    visited[node] = True
    new_set.add(node)
print(len(new_set)-len(graph_link_dict[cur_id]))
发表于 2020-07-24 15:47:10 回复(0)
牛客的OJ是真的垃圾...根本不知道问题出在哪了...😢😢😢
求大佬看看- -
"""
请检查是否存在语法错误或者数组越界非法访问等情况
case通过率为73.33%
"""
n,a,m = map(int, (input(),input(),input()))
c = dict([i,[]] for i in range(n))

for i in range(m):
    x,y = map(int,input().split(','))
    c[x].append(y)
    c[y].append(x)

o = set(c[a])
p = set()
def f(x):
    if x not in p:
        t = len(p)
        p.add(x)
        if len(p) != t:
            for i in c[x]:
                f(i)
f(a)
print(len(p)-1-len(o))


编辑于 2019-09-10 21:33:38 回复(1)

热门推荐

通过挑战的用户

查看代码