知识点整理 - 连通性相关 | 《综述图论中连通性及相关问题的一些处理方法》学习笔记
是 ix35 老师论文的学习笔记,同时也用作连通性相关知识梳理。
可能不会包含很多定义,大部分会用比较人话的阐述。如果读者对定义有疑惑可以搜索或阅读原论文。会包含一些例题。
没有给出简要题意或者题目链接的题都可以在洛谷上找到。
定义与记号
代表 到 的一条路径。有时也会用这个记号表示连通性。
无向图
-
点/边连通度:若 任意点割集大小不小于 ,则称 是 s-点连通的,同理定义 t-边连通。 的点/边连通度是上述 的最小值。图 的点/边连通度为所有点对间点/边连通度的最小值。
-
Menger 定理:对于任意 ,其是 k-边连通的,当且仅当存在 条 的边不交路径。点连通同理。
Menger 定理可以用最大流最小割定理证明。注意在定理中并没有要求路径不同,例如一张 个点的完全图对于任意 都有 k-点连通。
双连通性
即上述定义中的 2-连通性。
边双连通
边双连通性是点集 上的一种等价关系,也就是说,你可以根据边双连通性对 进行划分(实际上就是能把图划分成若干边双连通块),因此边双连通性会比点双连通性容易考虑。
注意到在 tarjan 算法的过程中满足 的点 是一个边双连通块的最浅点,并且其 dfs 树子树内还未被删除的点就构成一个边双连通分量,因此可以在 的时间内求出所有边双连通分量。
注意将边双缩点后图会形成一棵树。一般都利用此性质解决边双相关问题。
[NOIP2022]建造军营
比较经典的点双练习题。
考虑对于一个边双,无论你怎样选点,边双里面的边都不是必须被保护的。也就是说,对于一个边双,设其有 个点 条边,那么不在其中选择点的方案数是 ,在里面选择一些点的方案数是 。
然后考虑假设你选择了一些点,那么你必须保护的边其实就是这些点构成的虚树上的边,其余的边都有 种不同选择。那么考虑 dp,设 表示当前考虑了 节点的子树,虚树是否延伸到 的方案数,然后我们在每个点都统计一下计入答案。时间复杂度 。
点双连通
点双连通并不不是 上的等价关系,因此考虑起来没有边双那么容易。
可以使用 tarjan 算法求出图的所有点双连通分量。
点双连通的一些性质:
-
对于 ,存在经过 的简单环。
这是 Menger 定理的直接推论。因为存在两条除端点外不相交的路径。 -
对于任意一点 和任意一边 ,存在经过 的简单环。对于 ,存在经过 的简单环。
将边 拆成 ,然后用上条性质证明即可。 -
对于 和 ,存在经过 的简单路径 。
根据上条性质,选择一个包含 的环 ,尝试找到一条 的路径 ,满足 的交集大于 。注意 显然在交集中,若找不到这样的 ,说明 无法通过非 的点走到 上的点,那么 是割点,矛盾。设 交集中最靠近 的点为 ,那么选择 并包含 的路径和 拼起来就行。 -
共环:对于 ,若存在一个简单环同时包含 ,则称它们是共环的。注意到其实共环是一种对于边的等价关系,点双连通性实际上相当于一种对边集的划分。
在 OI 中好像很少见到不能使用圆方树做的涉及到点双连通分量的题目,所以这一部分就不贴例题了。
圆方树
用来描述无向图点双连通分量的数据结构。
圆方树具有一些性质。首先它是一棵树,另外对于广义圆方树来说,其圆点和方点必然交替出现。一个点是割点当且仅当其对应的圆点在圆方树上度数 。另外,原图中的一条路径必然只经过其在圆方树路径上的方点对应的那些点双,并且必然经过其在圆方树路径上的所有圆点。
圆方树经常可以用于处理仙人掌这种特殊结构。每条边/点至多只出现在一个简单环中的无向连通图被称为边/点仙人掌。圆方树可以非常方便的把仙人掌处理成一棵树 若干个环的结构。注意有时候针对仙人掌可能有必要建出普通圆方树,即不把 阶完全图视为一个点双的圆方树。
如果点双连通分量是一个环,那么圆方树建边时的顺序刚好对应在环上走一圈的顺序。
[广东省队集训2024]cactus
给定一个边仙人掌,问有多少种方式将边两两分为一组,其中每组的边有共同端点。对 取模。。
shaber 题目。
假设给的是一棵树,有简单 dp,设 表示当前已经匹配完了 子树内的边, 到其父亲的边是否已经使用过的方案数。那么转移的话相当于是一个分治乘法。直接 NTT 就行。(当然对于树有很强的性质,你可以直接确定一个子树的根到父亲的那条边是否被使用,因此可以做到线性)。要预处理匹配的方案数。
接下来考虑仙人掌的情况,我们肯定得在圆方树上考虑这个问题。观察一下发现,其实和树的情况差不多,但是每个点可以存在 条边还没有参与匹配。那么分类讨论:
-
对于圆点,直接使用树那一部分的 NTT 即可。
-
对于方点,分类讨论其父亲在环上对应的两条边是否被使用。然后做一个线性的 dp 求出方案数(在环上转一圈)。这里会有一点细节。
总时间复杂度 。
[APIO2016]铁人两项
经典题。
对原图建出圆方树,我们发现,对于 来说,合法的点只有其路径上经过的那些方点对应的点双里面的圆点。于是我们要求的就是 路径上方点对应的圆点的并去掉 之后的集合大小,最后求个和。
假设把方点的权值设成其对应的点双的大小,那么我们发现 路径上的权值和刚好是我们要求的东西加上路径上的圆点数量。于是我们把圆点的权值设成 ,问题就变成了求所有圆点对之间路径的权值和。
转化一下变成对一个点求出它会贡献多少次。这个容易做到线性。
[SWTR-8]地地铁铁
运用了很多点双连通的性质。
考虑先转化成求有多少对点之间只存在全 或者全 的简单路径。
先假设两点之间只存在全 路径或者全 路径的,不妨假设我们现在是要求值存在全 路径的点对。我们断言若路径上经过点双 ,满足 中存在 边,那么就不合法。由于在点双内对于 和 必然存在起点为 终点为 且经过 的一条简单路径,所以很容易证明上述结论。然后把所有这样的 去掉之后每个连通块求一下任选两点的方案数即可。
然后考虑两点之间既有全 路径又有全 路径的情况。首先如果经过了割点显然不合法。那么这样的点对显然只会出现在一个点双内部。
我们断言每个点双内最多只有一对点满足条件。通过找性质我们可以发现一对点双内存在一对合法对当且仅当点双内存在恰好两个点同时有 出边。那么我们就可以快速的找到所有这样的合法对了。
时间复杂度 。
[CF487E]Tourists
也算是经典题了。
考虑题目的描述就能让我们往圆方树上面想。注意到,假如我们要从 经过简单路径走到 ,那么我们只能走到 路径上所有点双内包含的点。并且对于一个点双,假设我们从 进入 走出,那么对于点双内任意一点 ,都一定存在经过 的简单路径 的简单路径。那么这告诉我们路径上所有点双内的点都是可以被经过的。
于是我们直接建出圆方树,把方点的权值设置成与其相邻的圆点权值的最小值,那么 到 路径上的最小值就是答案。对每个方点开个 multiset,直接维护是 的。
考虑使用树上路径查询问题的经典技巧,对于每个方点我们只维护其儿子的权值,那么一次修改我们的修改量就是 的。而查询我们可以一样查,只需要判断一下 LCA 是否是圆点,如果是圆点的话答案需要对其权值取 min。使用树剖 + 数据结构维护,时间复杂度 。
Tom and Jerry
不算太难的题。以下 指代 Tom, 指代 Jerry。
这个题面启发我们使用圆方树。考虑看样例,我们发现如果 能走到一个点双,满足其中不存在一个点可以到达所有点(称其为 类点双),那 就 win 了。还有别的情况,例如假设 走到某个点双的第一个点,满足这个点不能到点双内所有点(称其为 类点双),那么 就可以去那个到不了的点等着,然后等 走到这个点双之后就可以润掉。如果润掉之后,还存在一个这样的点双,那么 就可以反复横跳,这样 还是 win。
总结一下 什么情况下能 win。考虑 所在的初始点会把圆方树分成几个部分。如果 所在部分存在一个 类点双,那 就 win。如果 所在部分存在一个 类点双,并且满足对于所有点 ,假设 的初始点为 ,都存在至少一个 类点双,那 还是 win,否则 一定 win。
接下来就比较简单,首先我们要求出一个点双内某个点到其他点的边的数量。由于一个点可以在多个点双内,因此考虑点是不好考虑的。但是我们知道点双相当于是对于边集的划分,那么我们可以求出所有的边的等价类,这样只要我们能确定其中一条边属于哪个点双那我们就可以求出所有点在哪个点双中。考虑可以用共环关系划分边集,于是我们直接拉一个 dfs 树出来,然后对每条非树边把它和路径上的树边合并。这样就求出了边集的等价类。而在求点双的时候我们一定会知道一条边 (此处 为点双的最浅点),那么就可以求出所有边属于哪个点双。然后用 umap 维护一下点双内每个点的度数即可。
求出了这个之后考虑求出来对于一个点 ,假设其为 的起始点(也就是根),那么其邻点子树内是否存在 类点双。这个直接整个换根 dp 就行,存还是可以用 umap。
时间复杂度 。
当然这道题的判定条件可以简化成更简单的形式,最后可以把整个复杂度优化到线性。但是我觉得我的思路可能更符合人类一些。
耳分解
是对双连通图的另一种刻画,可以给我们提供一些看待双连通问题的新视角。
-
耳/开耳:一条简单路径或环,两端在一个子图内,剩余部分在子图外。若其为简单路径则成为开耳。
-
耳分解:初始有一个简单环(可以是单点),每次往里面加入一个耳,最后得到整张图,那么称这个无向图序列是一个耳分解。如果加入的都是开耳,那么就称其为开耳分解。
然后来看一下耳分解的一些性质以及怎么构造一组耳分解。
-
无向连通图 存在耳分解当且仅当 边双连通。
首先任意时刻的图肯定都是边双连通的,因此必要性显然。然后考虑怎么得到一个边双连通图 的一组耳分解。
没有边的情况直接判掉。然后考虑拉一棵 为根的 dfs 树出来。初始的时候先随便找一条端点为 的非树边造个简单环出来。
假设我们已经生成了一个图 。假设 的点集不为 ,我们找到一个 ,使得其不在点集中,但是其父亲 在点集中。因为双连通性可以得到存在一条非树边 满足 是 的祖先, 是 的后代。那我们选择路径 加上 这条边作为一个耳即可。
重复上述过程直到 的点集为 ,此时把剩下的边每个当做一个单独的耳加入即可。
由于我们保证 的点集始终是包含 的一个树上连通块,因此第二步中符合要求的 总能找到。 -
至少含有三个点的无自环无向连通图 存在开耳分解当且仅当 点双连通。
这个和上面的那个差不多,不过因为开耳需要不是环因此多了一些性质的要求。
双极定向
- 给定无向图 ,和两个不同的节点 ,以下四个命题等价:
- 在添加无向边 后, 点双连通;
- 的圆方树所有方点构成一条链,且 是圆方树的一条直径。
- 存在一种把 定向为 DAG 的方式,使 入度为 , 出度为 ,且其余点出入度均不为 。
- 存在一个所有点的排列 ,使得 ,且任意前缀以及任意后缀的导出子图都是连通的。
证明的话就考虑先证明 等价(显然),再证明 等价(取拓扑序),最后证明 能推 (耳分解), 能推 。
其中,第三个问题就是常说的双极定向问题。关于双极定向,ix35 的博客内并没有做介绍。需要的读者可以移步 双极定向。
这里简要讲一下怎么构造的。
由于存在双极定向方案当且仅当圆方树上方点构成一条链。那么我们只需要考虑如何对一个点双构造即可,不过这个时候 和 就已经固定了。
考虑对于一个点双,我们肯定是一个个删掉点/边,然后递归解决这个问题。我们有两种方法:
-
删除一条边。这样子不会对删点顺序产生影响。
-
对于二度点 ,设其邻居分别为 。那么我们可以把 删掉,然后最后把 插入回 之间。
那么具体的构造就很简单了,首先,我们找到原图的一棵生成树。对于每个叶子,我们保留其最浅的一条返祖边,让这个叶子变成二度点。然后删除掉所有叶子即可。
这样不断操作,最后整张图一定会变成一条以 和 为端点的链。最后我们把原来的解还原出来即可。时间复杂度 。
割集与切边等价
割空间与环空间
- 割集:对于点集的一个二划分,两端点不在同一集合中的边组成的集合。简记为 。
- 对于一棵树,任意边集都是割集。且对于每个割集,其对应的点划分唯一。
- 若连通图 有一棵生成树 ,那么对于任意 , 存在唯一一个割集 满足 ,且对应的划分 唯一。更进一步地,对于所有非树边 ,其在割集中当且仅当其跨过奇数条 中的树边。
- 割空间:在无向图 中,将任何一个边的集合看成 上的 维向量,则所有割集组成的集合是 上的一个线性空间,称为割空间。它的维数为 ,其中 为 的连通分量个数。这个线性空间的一组基就是每条树边和跨过这条树边的非树边构成的集合。
- 环空间:在无向图 中,考虑所有每个点度数均为偶数的子图 ,其中 看成 上的 维向量,构成一个线性空间,成为环空间。维数为 。这个线性空间的一组基就是每条非树边和树边组成的环。
环覆盖
给定简单无向图 ,对于每个 求出环空间中对应边集大小为 的元素数量。。
那这个就很显然了,就是把每条边 看成一个只有 位置是 的向量,然后相当于对所有的 求出有多少大小为 的子集向量和是全 。直接做是 的。
后面的话,可以把 dp 看成集合幂级数的乘法,最后利用 FWT 的若干性质将复杂度优化到 。但是和本篇博客的主题无关就不说了。
这题好像还有一个别的很厉害的做法,详见 CF1336E2。
割集的应用与切边等价
我们可以快速判断一个集合是否是割集。
考虑将每条边对应成一个 上的 维向量( 为非树边条数)。对于一条非树边,它对应的向量只有它这个位置是 ,而对于一条树边,所有跨过它的非树边的位置都是 。
那么对于割空间的基中的每一个元素,其对应的那些边的向量和为 。因此所有割集都满足对应的边的向量和为 。
在实现时我们肯定不可能真的用向量。考虑使用 Xor-Hash,对每个非树边赋一个随机权值,然后树边的边权就是跨过它的非树边的边权异或和。如果一个边集的边权的异或和是 ,我们就断言它是割集。
我们将上述边权相等的边划分成一个等价类,这种等价关系就是切边等价。切边等价有一些不同的定义形式:
-
切边等价。
-
都是割边;或者 在同一边双内,且删除 后该边双不再连通。
-
对于任意一个环,要么同时包含 ,要么同时不包含 。
容易证明三个命题等价。
DZY Loves Chinese II
给定无向图 , 次询问,每次给出一个边集,问删去该边集后图是否还连通。边集大小 。
那这个就是简单题了,相当于判断给定边集是否存在一个非空子集异或和为 。写个线性基就行了。
[ICPC 2015 WF]Tours
由于要求所有简单环上的颜色均匀分布,因此对于任意除割边外的切边等价类,颜色都应该是均匀分布的。于是有一个显然的染色方案是取 为所有切边等价类大小的最大公因数,然后将每个等价类均匀染色。我们可以知道这样染色后所有环上的颜色确实都是均匀分布的。另外我们也可以证明这样的 确实是最大的。
这样的话就可以使用 Xor-Hash 求出所有等价类的大小,然后求出 gcd,最后所有可能的答案就是最大答案的因数。时间复杂度 。
有向图
有向图中不一定存在双向的连通关系。
将一个有向图的边全部变为无向边,得到的无向图被成为原来有向图的基图。若基图连通,则称原图弱连通。
可达性问题
静态传递闭包
也就是不带修改的所有点对间可达性问题。这是 well-known 的问题,大家都知道可以用 Floyd 做到 ,也可以缩点后拓扑排序在 的时间内解决。
动态可达性问题
一般来说在 OI 中需要解决的动态可达性问题就是在一个动态结构上问你点对间可达性。由于有向图的可达性并不是一个双向的关系,因此这类问题是比较困难的。我们一般需要沿用在静态传递闭包中的 bitset 方法,结合一些操作/询问分块的数据结构技巧解决。
Range Reachability Query
给一张 DAG, 次询问只保留编号在 中的边, 是否可达 。
考虑沿用 bitset 方法。设 表示 能否只经过 中的边到达 ,把第二维用 bitset 存。那么考虑一条边,假设 代表所有满足 的 组成的 bitset,那么操作相当于 。
可以扫描线求,后面直接按照拓扑序做即可。时间复杂度和空间复杂度均为 。空间复杂度比较劣,得想办法优化。
对于这种使用 bitset 的题目,都有一种通用的空间优化方法,就是对 bitset 存的那一维进行分块。具体到这道题上,我们对询问进行分块,每 个使用上面的算法处理一次。注意到这样子做把空间复杂度优化到了 。而由于所有 bitset 的大小全部变成 了,因此时间复杂度保持不变(不过会加上一个 ,影响不大)。当然块长 不能太小了,不然 bitset 用了和没用一样。
有向无环图
给定一张 DAG,点有点权,初始全为 。有 次操作,操作包含将 可达的所有点的点权赋成 ,将 可达的所有点的点权对 取 ,以及询问一个点的点权三种。
这个题和可达性没啥关系,但是可以使用类似的方式处理。
首先求出 的传递闭包。然后对于一个询问 ,我们要做的相当于是,找到 的上一次赋值操作,然后求出上次操作到当前时间的取 操作的最小值。
对于第一个部分,考虑对询问分块,处理完一块之后更新整张图的信息。然后再枚举当前块的操作判断一下。
对于第二个操作,对整块预处理结果,然后散块暴力枚举操作就行。
时间复杂度 。然后空间还是会比较大,但是可以使用和上题类似的优化,我们每次求出来的传递闭包只保留当前块内涉及到的点即可。
强连通性
在有向图 中,若 能互相到达,则称 是强连通的。
强连通性有传递性,因而也是一种等价关系,可以按照强连通性把图划分为若干强连通分量。
可以使用 tarjan 算法在 的时间复杂度内求出所有强连通分量。
耳分解
考虑将无向图中的耳分解拓展到有向图上。耳和耳分解的定义与无向图中类似,只是对于有向图不存在开耳这个概念。
我们有如下结论:
- 有向图 可耳分解,当且仅当 强连通。
这个的必要性比较好证。首先 一定是强连通的。然后新加入的耳 必然会和 中的某些点构成一个环,那么 与耳上所有点强连通。因为强连通性具有传递性,因此可以得到 强连通。所以就可以归纳证明 也必须强连通。
至于充分性,我们只需给出一组构造即可。考虑先求出 的一棵 dfs 树,并使用 tarjan 算法求出每个点的 和 。令 为只包含点 的图,接下来我们按照 从小到大考虑每个点。设当前点 的 ,那么 对应的节点都已经在当前的 中了。判掉已经加入了 的情况,根据 (强连通性),一定存在 的后代 使得存在边 , 已经加入了。这个时候我们直接把 这条路径当作一个耳加入 。做完之后把剩下每条边单独当作一个耳加入即可。
有了耳分解,我们有如下推论:
- 无向图 可以被定向为强连通图,当且仅当 边双连通。
这个也挺好证的,就不说了。
APP 管理器
我们断言混合图 能被定向为强连通图当且仅当满足如下两个条件:将有向边看作无向边后图边双连通;将无向边全部拆成两条有向边后图强连通。
必要性显然。只需证明充分性即可。其实我们只需要证明取出一条无向边,使得其存在一个定向满足定向后两个条件仍然成立,那么就可以递归地证明充分性。
条件一和无向边的方向无关因此不需要考虑,只需要考虑条件二即可。令 删去无向边 后的图是 ,那么在 中,对于所有点 , 相互可达和 相互可达一定满足一个。那么图中最多有两个强连通分量。若这两个强连通分量之间没有边则不满足条件一,否则 可达 和 可达 之间一定满足一个。这个时候我们只需要将这条无向边定成反方向即可。
有了上述两个判断条件,很容易做到 的复杂度。这题甚至还有 的厉害做法,但是我一直不会。
竞赛图
竞赛图可以看作是有向的完全图。其有很多与连通性有关的性质和结论。
三元环
一般图上的三元环计数只能做到 。但是在竞赛图上,可以做到线性。
考虑补集容斥,我们总共有 个三元组。
对于一个不合法的三元组 而言,其必然存在且只存在一个点满足其连向剩下两个点。于是这样的三元组个数为 。
所以总的三元环个数就是 。
图图
给定一张 个点的竞赛图和两个数组 。 之间边的方向由 和 的大小关系决定。求图中的三元环个数,以及找出一组三元环。。
由于我们已经有了算竞赛图三元环个数的公式,因此只需要求出每个点的出度即可。
哈密顿路
首先竞赛图一定有哈密顿路。
证明很容易,考虑归纳法。假设 个点的竞赛图存在哈密顿路,那么不妨设这条路径就是 。那么如果有 就直接加在开头,有 就连在结尾。否则可以发现中间肯定存在一个断点 满足 ,(这个可以二分),插进去即可。
接下来考虑哈密顿回路。我们断言,强连通的竞赛图具有哈密顿回路。
首先构造一条哈密顿路,不妨设为 。找到最大的 使得 (由于强连通因此一定存在),那么对于 都有 。那么我们现在有一个 的环,我们需要加入 的点。我们发现,在任何时刻都可以找到一个不在环上的点 和在环上的点 满足有边 ,否则与强连通性矛盾。那么我们一定可以在换上找到一个位置 ,在 后面插入 。重复这个过程即可构造出一条哈密顿回路。具体做的时候也差不多,我们直接扫,如果当前点到环上有边就插入,否则一直到下一个可以插入的点,然后把这条链整个塞进去即可。时间复杂度 。
强连通性
竞赛图上的强连通性比一般图上的强连通性更好。
竞赛图在缩强连通分量之后会形成一条链。考虑对于两个不同强连通分量之间的点 ,必然存在 或 。也就是说这些强连通分量必然构成一个全序集,也就是一条链。
在竞赛图上求强连通分量不需要使用 tarjan 算法。考虑找到一条哈密顿路,那么逆着链方向的边会把一段区间变成一个环。将所有这样的区间合并即可。
Landau 定理
可以用来方便判定竞赛图以及求出竞赛图的强连通分量。
-
Landau 定理:设竞赛图中所有点按照出度从小到大排序为 , 的出度为 ,则对于每个 ,有 。一个序列 是竞赛图合法的出度序列当且仅当对于每个 ,有
-
拓展: 的每个 SCC 都是排列 中的一个连续段,且 是一个强连通分量的右端点当且仅当 ,且靠右的强连通分量可达向左的强连通分量。
考虑前 个点的导出子图已经有 条边了,因此必要性显然。
考虑构造证明充分性。设我们需要构造的竞赛图的出度序列为 。先构造一个平凡的竞赛图,其满足对于 有边 ,其出度序列为 。
假设我们当前构造的竞赛图为 ,其出度序列 满足:
的时候一定取等号。注意我们初始的竞赛图是满足这个条件的。
设 为第一个满足 的位置,容易发现其前面的位置都满足 (若不存在这样的 ,则已经构造完成)。设 为最后一个满足 的位置。再考虑 是第一个满足 的位置,这个位置显然严格大于 ,并且一定存在。()
我们可以得到 ,也就是 。也就是说,一定存在一个点 使得存在 和 !
于是我们翻转这两条边,得到一个新的竞赛图,显然其仍然满足上面的条件。
设当前竞赛图的势能 ,我们发现每次操作都会让 。而由于 ,一定有 ,也就是说在 步内我们一定可以构造出 序列对应的竞赛图。于是充分性得证。
定理的拓展不难证明,在此不赘述。
注意 如果是入度,定理仍然成立。
基础图论练习题
考虑使用 Landau 定理解决这个问题。
首先把每个点的出度求出来排序,然后依次考虑每条边。对于一条边 ,我们翻转它的影响相当于是 。
注意到上面的修改操作可以转化成如下两种:
-
把某个 相同的连续段的最左侧元素 。
-
把某个 相同的连续段的最右侧元素 。
维护每个极长 相同连续段内 的最小值和最小值个数,我们就可以做到 修改。时间复杂度 。
这道题也可以用哈密顿路的方法做,但是实现很麻烦,不如这种做法一根。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】