bfs社交网络算法(图形算法)-hackerearth

时间:2018-07-06 10:43:14

标签: python python-3.x algorithm breadth-first-search

我从hackerearth (link to problem)尝试了这种广度优先的搜索实践问题。我的代码通过了示例测试用例。但是,关于提交测试用例,我缺少一些东西。

我通过我编写的文档距离程序(用于首次提交输入)运行“我的输出”和“测试输出”,发现该距离为〜0.52(deg)[0 deg表示文档完全相同,并且90度表示文档完全不同]。这样做只是为了大致衡量我的错误程度。我需要帮助才能找到我无法在代码中说明的情况。

问题描述:

在社交网站中,人们与其他人保持联系。整个系统显示为巨大的连接图。在此问题中,您需要回答在t个节点彼此相距不远的情况下连接的总人数(t距离连通性)。例如:两个直接连接的人之间的距离为1。虽然两个人有共同的接触但没有直接的连通性,但他们之间的距离却是2。

输入行的第一行包含两个整数n和e,其中n是节点,e是边。下一条e行将包含两个整数u和v,这意味着节点u和节点v以无向方式彼此连接。下一行包含单个整数m,即查询数。接下来的m行中,每行都有两个输入,一个作为源节点,另一个作为必需的t距离连接,应用于处理查询。

注意:节点索引将从0开始。所示的示例和测试用例是基于1的索引。要提交解决方案,请使用基于0的索引。

示例输入:

9 10

1 2

2 3

1 7

2 4

3 4

4 7

7 8

9 7

7 6

5 6

3

4 2

5 3

2 1

输出:

4

4

3

说明 创建图表后,有3个查询,

i。源节点:4,我们必须找出与节点4相距2的节点总数。 1(4-> 2-> 1),8(4-> 7-> 8),9(4-> 7-> 9),6(4-> 7-> 6)= 4

ii。与上述类似

iii。源节点:2,我们必须找出与节点2相距1的节点总数。 1(2-> 1),4(2-> 4),3(2-> 3)= 3

link for input graph image

#social network bfs algorithm
from collections import deque
graph = {}
queries = []
def accept_values():
    #accept number of vertices and edges
    vertex_edge = [int(i) for  i in input().strip().split(" ")]
    #accept the edges for the undirected graph
    for i in range(vertex_edge[1]):
        edge = [int(i) for i in input().strip().split(" ")]
        try:
            graph[edge[0]].append(edge[1])
        except:
            graph[edge[0]] = [edge[1]]
        try:
            graph[edge[1]].append(edge[0])
        except:
            graph[edge[1]] = [edge[0]]
    #accepting the number of queries and the queries themselves
    number_of_queries = int(input())
    for i in range(number_of_queries):
        queries.append([int(i) for i in input().strip().split(" ")])
    #applying bfs on the (source, required distance) queries
    for query in queries:
        bfs(query)

def bfs(query):
    counter = 0
    q = deque()
    q.append(query[0])
    visited = {query[0] : True}
    distance = {query[0] : 0}
    while q:
        popped = q.popleft()
        for neighbour in graph[popped]:
            if neighbour not in visited:
                visited[neighbour] = True
                #stop looking further because we have all the nodes at the required distance, i think
                if distance[popped] + 1 > query[1]:
                    for key in distance:
                        if distance[key] == query[1]:
                          counter +=1
                    print(counter)
                    return
                #keep going until we reach the required query distance
                else:
                    distance[neighbour] = distance[popped] + 1
                    q.append(neighbour)
    #prints 0 if there are no such nodes
    print(counter)
#calling function to accept values as per required format
accept_values()

0 个答案:

没有答案