算法:有向图强连通分量 (2020网易互联网秋招笔试题4, 教授)

算法竞赛——强连通分量 强连通分量 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通。 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连图图的基础上加入一些点和路径,使得当前的图不在强连通,称原来的强连通的部分为强连通分量。 DFS生成树 DFS生成树是根据DFS搜索顺序构成的一颗生成树,形如(自上而下,自左而右): 有向图的 DFS 生成树主要有 4 种边: 树边(tree edge):示意图中以黑色边表示,每次搜索找到一个还没有访问过 阅读详情

有向图强连通分量 - 2020网易互联网秋招笔试题4

题目

网易互娱笔试题:
假设教授A欣赏B,B欣赏C,则认为A也欣赏C。
输入 第一行两个整数 n m,分别表示教授人数,欣赏关系数量
余下m行,每行两个整数 a b,表示教授a欣赏b。
输入样例:
5 6
1 3
2 1
3 2
3 5
4 5
5 4
输出:
4

暴力1号(邻接矩阵)

考试提交的版本,直接迭代求解邻接矩阵(超时

def solve(N:int, Edges:[[int]]):
    Map = [[False]*N for _ in range(N)]
    for u, v in Edges:
        Map[u-1][v-1] = True

    flag = True
    while flag:
        flag = False
        for i in range(N):
            for j in range(N):
                if Map[i][j]:
                    for k in range(N):
                        if k != j and k != i:
                            if Map[j][k] and not Map[i][k]:
                                flag = True
                                Map[i][k] = True

    count = 0
    for i in range(N-1):
        for j in range(i+1, N):
            if Map[i][j] and Map[j][i]:
                count += 1

    return count

暴力2号(邻接表)

考试实验的第二个版本,当然也超时了

class Node:
    def __init__(self, value):
        self.value = value
        self.next = set()
        self.last = set()

    def append(self, i:int, node_dict:{}):
        if i == self.value or i in self.next:
            return
        else:
            self.next.add(i)
            for j in node_dict[i].next:
                self.append(j,node_dict)
            for l in self.last:
                node_dict[l].append(i, node_dict)
    def appreciate(self, i):
        return i in self.next

def solve2(N:int, Edges:[[int]]):
    if len(Edges) <=1:
        return 0
    Node_dict = {}
    for U, V in Edges:
        u = U - 1
        v = V - 1
        if u not in Node_dict.keys():
            Node_dict[u] = Node(u)
        if v not in Node_dict.keys():
            Node_dict[v] = Node(v)
        Node_dict[u].append(v, Node_dict)
        Node_dict[v].last.add(u)
    count = 0
    for i in range(N-1):
        # print(i, Node_dict[i].next, Node_dict[i].last)
        for j in range(i+1, N):
            if Node_dict[i].appreciate(j) and Node_dict[j].appreciate(i):
                count += 1
                # print(i,j)
    return count

2次DFS求解

  1. 后序DFS,标记编号
  2. 从大编号DFS反图

我花了爆久才能想得通这个为什么是正确的。因为第一次是后序dfs,所以编号最大的一定是某个连通分量的根R,第二次求反图,如果能找到任何一个反向边,这个边一定连向某个编号比它小的点,也就意味着是第一次dfs时R的子树,反向边本身意味着R是它的子树,那么就这样构成了回路。所以通过求反图,就可以遍历到R所在的整个强连通分量

会不会存在一种情况,第一次后序dfs从不同根节点开始便利了几次,这样在前面dfs到的节点编号(假设是u)就会比后面小,但前面的节点(u)就可能并不是后面更大编号点(假设是v)的子树,而求反图恰恰发现v连向u,这样就不符合上述逻辑?
答:不会,假设反图中更大编号点v连向更小的点u,则在第一次dfs,u是在v之前遍历到的,且u具有指向v的边,那么在编号时,v点的编号一定比u小,与假设矛盾

class Node2:
    def __init__(self, value):
        self.value = value
        self.next = set()
        self.last = set()
        self.number = -1
        self.mark = False

    def to(self, s):
        self.next.update(s)
    def _from(self, s):
        self.last.update(s)

    def last_order_dfs(self, node_dict, number, have_past):
        if self.value in have_past:
            return number
        else:
            have_past.append(self.value)
            for next_node in self.next:
                number = node_dict[next_node].last_order_dfs(node_dict, number, have_past)
            self.number = number
            return number + 1

    def second_dfs(self, node_dict):
        count = 0
        if self.mark:
            return 0
        else:
            self.mark = True
            count += 1
            for last_node in self.last:
                count += node_dict[last_node].second_dfs(node_dict)
            return count

def solve3(N:int, Edges:[[int]]):
    Node_dict = {i+1:Node2(i+1) for i in range(N)}
    for u, v in Edges:
        Node_dict[u].next.add(v)
        Node_dict[v].last.add(u)

    number = 1
    second_search = {}
    have_past = []
    for index in range(1, N+1):
        number = Node_dict[index].last_order_dfs(Node_dict, number, have_past)
        second_search[Node_dict[index].number] = index
    branch_size = []
    for i in range(N, 0, -1):
        index = second_search[i]
        branch_size.append(Node_dict[index].second_dfs(Node_dict))
    ret = 0
    for size in branch_size:
        ret += int(comb(size,2))
    return ret

1次DFS求解

我看完缩点原理就以为自己会了,如果构成回路,就把回路上的点搜索为一个点,但是我根据这个原理就是实现的非常糟糕。
最后还是参考了https://byvoid.com/zhs/blog/scc-tarjan/
但其实还是不会灵活运用QAQ

class Node3:
    def __init__(self, value):
        self.value = value
        self.next = set()
        self.have_searched = False
        self.number = -1
        self.contain = 0

    def dfs(self, node_dict, count, have_past):
        if self.number !=  -1:
            return self.number, count, have_past

        count += 1
        self.number = count
        children = [count]
        have_past.append(count)

        for next_node in self.next:
            child, count, have_past = node_dict[next_node].dfs(node_dict, count, have_past)
            children.append(child)

        low = min(children)

        if low == self.number:
            count = 1
            while have_past[-count] != self.number:
                count += 1
            self.contain = count
            have_past = have_past[:-count]
        return low, count, have_past

def solve4(N:int, Edges:[[int]]):
    Node_dict = {i+1:Node3(i+1) for i in range(N)}
    for u, v in Edges:
        Node_dict[u].next.add(v)

    ret = 0
    for index in range(1,N+1):
        Node_dict[index].dfs(Node_dict, 1, [])
        ret += int(comb(Node_dict[index].contain, 2))
    return ret

网易2020/8/8笔试题(四) 第一题地址:网易2020/8/8笔试题(一) 第二题地址:网易2020/8/8笔试题(二) 第三题地址:网易2020/8/8笔试题(三) 接上篇博客,网易笔试题第四题:学术认可。 高校中有n个教授,可以在评定中每个教授可以投出自己认可的教授,每个教授可以投多个人,也可以投自己。 规定若A认可B,B认可C,则A也认可C。 问有多少对教授是互相认可的? 输入为n(教授个数),m(认可的关系数),以及m组数字,每组数字代表一个单向认可的关系,如1 3表示教授1认可教授3。 对于输入案例: 5 阅读详情

相关推荐

别再手动写用例了!用AI Agent自动生成测试用例的保姆级实战(附Python代码)

本文详细介绍了如何利用AI Agent技术自动生成测试用例,大幅提升测试工程师的工作效率。通过Python代码实战演示,从环境搭建到核心Agent构建(需求解析、场景挖掘、用例编排),再到与企业工具链(TestRail、Jira)的深度集成,帮助团队实现测试用例的智能化生成与管理。

weixin_30897233的博客 649

2024年JavaScript流程控制-分支,前端开发社招面试经验

对于应届生或工作年限不长的人来说,刷面试题一方面能够尽可能地快速自己对某个技术点的理解,另一方面在面试时,有一定几率被问到相同或相似题,另外或多或少也能够为自己面试增加一些自信心,可见适当的刷题是很有必要的。一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。3.4、if-else-if语句。5.2、switch注意事项。5.3、查询水果案例。

2401_84434086的博客 565

LoRa模块选型指南:正点原子ATK-LORA-01与SX1278芯片深度评测(含实测距离/功耗数据)

本文深度评测了正点原子ATK-LORA-01与SX1278芯片的性能表现,通过实测数据展示其在复杂环境中的通信距离与功耗表现。特别适合智慧农业、工业监测等物联网应用场景,提供详细的配置指南和优化技巧,帮助开发者实现高效、低功耗的LoRa通信解决方案。

weixin_29191081的博客 292

[蓝桥杯2018初赛]小朋友崇拜圈(dfs暴力 / Tarjan求强连通分量)

(碎碎念:开始没有觉得dfs暴力能过,毕竟数据范围是1e5,暴力的最差复杂度可能直接会飙到1e10(1e5个点凑成一个环),但是蓝桥杯也不愧被誉为"暴力杯",数据比较体贴,数据里面没有这种的极端情况。思路:每个点跑一遍dfs,如果dfs过程中遇到了该点,则表示构成了一个环。dfs过程中记录一下路径长度,如果构成了环则更新一下最大值即可。思路:每个点跑一遍tarjan,求最大的强连通分量就行。(这个解法才应该算是比较合理的解法,大概20ms,时间优化了10倍)题目大意:给定一张图,求最大的环。

qq_63128300的博客 536

万物皆可GAN ---普通GAN, pix2pix, CycleGAN和pix2pixHD的比较以及演变过程

普通GAN, pix2pix, CycleGAN和pix2pixHD的原理、比较以及演变过程

m0_61985580的博客 3726

Opencv2.4.9源码分析——HoughCircles

图形可以用一些参数进行表示,标准霍夫变换的原理就是把图像空间转换成参数空间(即霍夫空间),例如霍夫变换的直线检测就是在距离-角度空间内进行检测。圆可以表示成: (x-a)2+(y-b)2=r2                   (1) 其中a和b表示圆心坐标,r表示圆半径,因此霍夫变换的圆检测就是在这三个参数组成的三维空间内进行检测。 原则上,霍夫变换可以检测任何形状。但复杂的形状需要的

赵春江的专栏 3万+

DAY_11(强连通分量)

求解强连通分量有两种算法,tarjan和kosaraju:在有向图G中,若两个点u、v是互相可达的,则称u和v是连通的。如果G中任意两个点都是互相可达的,称G是。:如果一个有向图G不是强连通图,那么可以把它分成多个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任意点强连通,称这样一个“极大强连通”子图是G的一个有个常见的问题:求G中有多少个scc?我们先来尝试着把每个scc抽象成一个个的群岛,群岛由有着很多或很少的小岛组成,群岛内部连通;

hycccccch的博客 746

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制

本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。

weixin_29271263的博客 399

有向图的强联通分量相关例题(Korasaju算法和Tarjan算法)

有向图的强联通分量相关例题(Korasaju算法和Tarjan算法) 一、poj 2186:Popular Cows 即:强连通分量+缩点 还是很菜,都是照着大佬的板子敲的,而且还不是很熟练 Korasaju算法 实现 /**korasaju算法*/ #include<cstdio> #include<cstring> #include<algorithm>...

serendipity的博客 678

GD32F105RBT6 keil工程模板

创建GD32F105RBT6的keil初始基础工程,未来的所有外设驱动都是基于这个基础工程进行扩展。

RMDYBW的博客 1932

OpenGL ES 3.0 从入门到精通系统性学习教程

因为在工作中频繁使用 OpenGL ES 做一些特效、滤镜之类的效果,加上平时学到的的知识点也比较细碎,就想着去系统地学习下 OpenGL ES 相关开发知识,并将学习过程记录下来。

字节流动 3万+

暴力搜索强连通分量

上次我讲过了kosaraju算法 这次有更好理解的算法! 暴力出奇迹! 大家来看一下这个题: https://bbs.codeaha.com/problem-12175.html 每个星球人都梦想着成为啊哈星球中的明星,成为星球人们的偶像。啊哈星球共有N (1&amp;amp;lt;= N &amp;amp;lt;= 10,000)个星球人,现在告诉你M (1 &amp;amp;lt;= M &amp;amp;lt;=50,000) 条星球人间的关系,形如(A...

weixin_43510247的博客 239

Python的单元测试之unittest

是一个功能类似 unittest 的库,它集合众家标准测试库之所长,和 unittest 相比,功能更为强大,使用更为简单,OpenStack 广泛的利用它编写单元测试。unittest 提供了自动匹配发现并执行测试用例的功能,随着项目代码结构越发庞大,势必有多个测试文件,自动匹配发现并测试用例的功能在此就显得非常有用,只要满足。unittest 提供了丰富的命令行入口,可以根据需要执行某些特定的用例。的测试用例都会被 unittest 发现并执行,测试用例文件的默认匹配规则为 test*.py。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 283

强连通分量

点击打开链接

567

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于强连通分量

首先要明白什么是强连通分量? 强连通分量实际上指的是一些点的集合,而这个集合的定义就是:任意集合中的点都能到达其他所有同样在集合中的点 然后就是强连通分量的意义,或者说是作用: 就目前而言,我认为他的作用就是缩点。 什么叫做缩点呢? 就是当把整个图中的点分成多个不同的集合以后,每个集合都可以看成一个点。然后每个集合之间的连线就像这些超级点的连线一样。 为什么要缩点? 这有点像物理中的

LLPPDD的博客 4721

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

POJ-2186(强连通分量)

poj-2186 题意:每头牛都想成为牛群中的红人。给定N头牛的牛群和M个有序对(A, B)。(A, B)表示牛A认为牛B是红人。该关系具有传递性,所以如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人。不过,给定的有序对中可能包含(A, B)和(B, C),但不包含(A,C)。求被其他所有牛认为是红人的牛的总数。 比较暴力的思路:假如我们直接暴力就是我们直接建图,然后再对每...

qq_42757965的博客 361

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

有向图的强连通分量

1.定义 在一个有向图中,如果有两个点 (u,v)(u,v)(u,v)可以在图中互相到达,那么就称这两个点是强联通的.。而如果一个有向图上的任意两点都可以互相到达,那么就成这个图为强连通图。而一个有向图中的极大强连通子图就被称为强连通分量。(极大强连通子图就是指一个强连通子图,再加入任何额外的节点都无法保证这个新的图是一个强连通图) 举个例子: 显然这个图里两个点集[1,3,5][1,3, 5][1,3,5]和 [2,4][2, 4][2,4],在各自点集里的各个点都可以互相到达,且不存在更大的点集,所以

SteveMC的博客 8271

【算法题归纳合集】图论-有向图的强连通分量

一、AcWing 1174. 受欢迎的牛 【题目描述】 每一头牛的愿望就是变成一头最受欢迎的牛。 现在有NNN头牛,编号从1∼N1\sim N1∼N,给你MMM对整数(A,B)(A,B)(A,B),表示牛AAA认为牛BBB受欢迎。 这种关系是具有传递性的,如果AAA认为BBB受欢迎,BBB认为CCC受欢迎,那么牛AAA也认为牛CCC受欢迎。 你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。 【输入格式】 第一行两个数N,MN,MN,M; 接下来MMM行,每行两个数A,BA,BA,B,意思是AAA

一只快乐的小蒟蒻~ 1868

第三部分 图论算法 (第四章 强连通分量)例题

例题一: 有向图缩点 link 思路: 大家一开始可能都会想到直接用SPFA跑最长路,时间复杂度为O(nm)O(nm)O(nm), 看看数据,TLE是必然的。 那有没有时间更优的方法——强连通分量。 分析题意,每个点点权只被计算一次,允许一条边走多次, 那我们考虑用Tarjan来进行缩点, 使图变成有向无环图,再进行DPDPDP。 设转移方程为:f=max(fu+disv,fv)f=max(f_u+dis_v,f_v)f=max(fu​+disv​,fv​) fif_ifi​表示以i作为终点的路径所经过

蒟蒻こんにゃく 681

强连通分量题集

一本通OJ 灵动OJ A.受欢迎的牛(popular) 题意描述 原题来自:USACO 2003 Fall 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。 解...

帅比王的博客 1517

图——强连通分量

强连通分量(strongly connected component, SGG) 是满足如下条件的结点的子集????, ???? ∈ ???? 对于任意两个结点????, ???? ∈ ????,都有 从????出发到????的路径; 从????出发到????的路径; ????是最大的(maximal),添加任何一个结点进去,上述条件都不再满足 问题描述: 给定一个有向...

清风拂面 1378

求解有向图的强连通分量的SCC问题---POJ 2186 Popular Cows

【SCC问题】 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected),如果有向图G的每两个顶点都强连通,称G是一个强连通图.通俗的说法是:从图G内任意一个点出发,存在通向图G内任意一点的的一条路径. 非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components,SCC). 求图强连通分量的意

Keaper的博客 4752

强连通分量例题

强连通分量例题 带明星 题意: 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 A 喜欢 BB,B 喜欢 C,那么 A 也喜欢 C。牛栏里共有 N 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。 输入: 第一行:两个用空格分开的整数:N 和 M。 接下来 M 行:每行两个用空格分开的整数:A 和 B,表示 A 喜欢 B。 $ 1≤N≤10^4, 1≤M≤5×10^4 $ 输出: 一

m0_51145827的博客 999

网易互娱笔试题-幸运N串

题目描述: 连续N串被认为是幸运串,给一个全部由大写字母组成的字符串,允许改变最多两个大写字母(也允许不改变或改变1个大写字母), 是的字符串中包含的最长的连续N串的长度最大。 输入:T 表示有T组用例 每一行用例包含一行大写字符串S(0<|S|<50000,|S|为字符串长度 输出: 每一个测试用例,输出一个整数,表示操作后包含的最长连续N串的长度 比如: 输入 3 NNGN N...

orangefly0214的博客 1692

浙大PTA-Python题库 编程题第三章(3-1~3-22)题解

其他各章题解链接如下 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解 https://blog.youkuaiyun.com/zimuzi2019/article/details/107020657 浙大PTA-Python题库编程题 第二章(2.1~2.14)题解 https://blog.youkuaiyun.com/zimuzi2019/article/details/106984549 浙大PTA-Python题库 编程题第三章(3-1~3-22)题解 https://blog.youkuaiyun.com/zimu

zimuzi2019的博客 7万+
上一篇: 强化学习策略梯度梳理-SOTA下(A2C,A3C 代码)
ThousandsOfWind
博客等级 码龄11年 21粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值