题解 | 基因调控网络

基因调控网络

https://www.nowcoder.com/practice/ef455ef70e704e4d926538de1cf242b2

另一种思路,相比官方解法空间复杂度更小,时间复杂度好像也更小,不知道论证的严不严谨。

先统计每个基因能激活谁和被谁激活,然后两两组合基因bd,看哪些其他基因是符合条件的a和c,最后两两组合ac基因,注意a和c不能是同一个基因。

复杂度方面,因为m << n*n,标答adj矩阵空间复杂度明显过高。时间复杂度方面,虽然本方法和标答外围两次循环都是O(n*n),不过本方法set运算的复杂度是O(min(|set1|, |set2|)),最坏情况是m/n,总体更小一点。而且set运算由底层C语言实现。实测总体速度为标答3倍。

n, m = map(int, input().split())

activate_list = [set() for _ in range(n)]
activated_by_list = [set() for _ in range(n)]

for _ in range(m):
    a, b = map(lambda x: (int(x)-1), input().split())
    activate_list[a].add(b)
    activated_by_list[b].add(a)

# print(activate_list, activated_by_list)
count = 0
for i in range(n):
    for j in range(i+1, n):
        a_set = activated_by_list[i] & activated_by_list[j]
        if a_set:
            c_set = activate_list[i] & activate_list[j]
            if c_set:
                # print(a_set, c_set)
                count += len(a_set) * len(c_set) - len(a_set & c_set)

print(count)


全部评论

相关推荐

点赞 评论 收藏
分享
zaakfung:26届不应该春招吗 为啥还实习
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务