「学习笔记」二分图和网络流

「学习笔记」二分图和网络流

序言

基本是对ix35整理内容的抄写。所以你会发现大量的重合。

只有一些不偏向定义的才会用自己能更好理解的话解释出来。

所以一些证明会相比其他人说明更加繁琐,不过这是写这篇文章此时的我能力内的理解,如果将来有更好的理解,能从更高的角度 / 从更简洁的语言出发,还会更新。

定理和推论,构造方案相关,也就是除去定义和证明以外比较重要的内容,都加粗了,复习的时候可以直接看加粗的内容。

二分图

二分图

定义

对于无向图 G=(V,E),若存在将 V 划分成两个不相交子集 A,B 的方案,使得 A,B 的点导出子图都不含边,则称 G 为二分图,A,BG 的两部。

(u,v)E(uA,vB)(uB,vA)

根据定义,我们可以得出二分图是可以被二染色的图,即把每个节点着黑白两色之一,使得每条边的两个端点颜色不同,这等价于二分图的定义。

定理:图 G 为二分图,当且仅当 G 中不存在长度为奇数的环。

注:这里讨论的环如无特殊说明均为简单环,具体标准定义参考 oi-wiki

可以用二染色来证明这个定理。

G 中存在长度为奇数的环 v1,v2,...,v2k1,那么将 v1 染成黑色(黑白两色是对称的),那么 v2 一定要染成白色。以此类推,v1,v3,...,v2k1 都要染成黑色,由于 v1v2k1 相邻,所以该图不能被二染色,则该图不是二分图。必要性得证。

G 中不存在长度为奇数的环,由于各个连通分量之间相互独立,考虑其中任意一个连通分量:求出任意一棵生成树,对于生成树上奇数深度的点染成黑色,偶数深度的点染成白色,由于不存在奇环,则相同颜色点之间必然没有边相连,即得到一个二染色方案,则该图是二分图。充分性得证。

推论:二分图 G 的任意子图都为二分图

推论:图 G 是二分图当且仅当其每个连通分量都是二分图。

证明是比较显然的,因为图 G 是二分图则其任意子图中都不存在奇环;图 G 不存在奇环等价于其各个连通分量里都不存在奇环。

至此,我们可以得出判断一张图是否为二分图的算法:

  • 对于图 G,根据第二条推论,只需要判断每个连通分量是否是二分图。
  • 对于图 G 的任意一个连通分量,从任意一点开始 dfs,来求出任意一棵生成树,如果遇到非树边,判断深度的奇偶性是否相同,若相同,那么出现了奇环,G 不是二分图;若所有非树边两端点深度奇偶性都相同,则根据深度奇偶性划分可得到一个二染色。
  • 综上,可在时间复杂度 O(|V|+|E|) 内解决问题。

栗题:[HNOI 2019] 校园旅行

给定无向图 G=(V,E),每个点有 01 的一个标记,有 q 组询问,每组询问给定 s,tV,你需要求出是否存在一条 st 的路径 P,使得路径经过的点的标记拼成一个回文。P 可以不是简单路径。

1n5000,1m5×105,1q106

暴力的想法是考虑 fi,ji 是否能走到 j,然后用类似 bfs 的方法更新 f,每次从队列中取出一个 f,往两边扩展,如果能更新新的 f 就扔进队列里面。这样复杂度是 deg×deg=O(m2).想办法优化这个暴力,也就是减少无用的边数。

如果要经过 (u,v) 从点 u 走到点 v,考虑可以在这条边上来回折返,那么我们只关心这两个点组成的 01 串出现次数的奇偶性。

考虑仅有两端点为 00 或者 11,10(01) 的边及其端点组成的连通块,假设为 00:如果要经过这个连通块,由于只关心路径上 00 出现次数的奇偶性,所以要保留的信息仅为任意两点之间路径经过边数奇偶性的可能性。

考虑到如果连通块中有奇环,那么在这个奇环中走一圈会到起点,即可改变路径奇偶性,则任意两点经过的边数奇偶都可以;如果没有奇环,说明是个二分图,那么两点如果在同一部点中,则经过边数一定是偶数,否则经过边数一定是奇数。

由于我们只关心经过路径奇偶性,所以如果该连通分量是二分图,那么直接保留一个尽量小的连通子图,保留一棵生成树即可,如果该连通分量不是二分图,保留一棵生成树然后加一个非树边组成一个奇环即可,例如一个自环。可以发现这样边数降到了 O(n),任意两点之间路径经过边数奇偶性的可能性不变。

这样子建图之后做那个 bfs 就可以 O(n2+q) 解决这个问题。

二分图最大匹配

二分图最大匹配问题,即对于给定的二分图 G=(V,E),求出大小最大的边集 AE 使得 A 中不存在两条共端点的边。

匈牙利算法

P 是一个匹配,其中的边称为匹配边,匹配边的端点称为匹配点,如果一条路径从一个未匹配的左部点出发到达一个未匹配的右部点,交替经过不在 P 中的边和在 P 中的边,则称该路径为一条增广路

定理:匹配 P 是二分图的最大匹配,当且仅当图中不存在增广路。

必要性:将这条增广路上的所有匹配边改为非匹配边,所有非匹配边改为匹配边,则匹配数量增加。

充要性:反证法。对于匹配 P 满足图中不存在增广路。假设图中最大匹配为 P,则求出 PP 边导出子图的对称差 T.由于 PP 都是匹配,则 T 中点的度数均不超过 2,则 T 为若干个环和若干条链构成,如果 P 小于 P,说明 T 中属于 P 的边要更多,由于环和偶链属于两者的边数相等,那么就说明一定存在奇链,即为一条增广路,与假设不符。

由充要性的证明,引出匈牙利算法

枚举左部点 i=1,2,...,n,维护 1,2,...,i1 与右部点的匹配,尝试对 i 进行匹配,进入以下过程:

  • 假设尝试对左部点 x 进行匹配,枚举出边到达的点 y
  • y 没有被匹配,则找到一个增广路 xy
  • 否则尝试对 y 匹配的左部点 x 进行匹配,若匹配成功则找到一个增广路 xyx....若找到增广路,则将增广路上的边选择状态取反,答案 +1
  • 优化:每次从 i 寻找增广路时,如果一个左部点 x 或者右部点 y 之前被检查过没有找到增广路,则不必再检查一遍。
  • 对于每个左部点,检查是 O(m) 的,故算法的时间复杂度为 O(nm)

匈牙利算法基于一个贪心的原则:一个点一旦进入匹配,就不会重新成为非匹配点,因此当找不到增广路时表示 i 在保持 1,,i1 的匹配情况不变时一定无法加入最大匹配中。

基于此,我们可以得知,若将匹配成功的左部点视为 1,没有匹配的视为 0,则按照枚举顺序来拼接这些左部点,得到的字典序是最大的。

最大流做法

建立源点 s 和 汇点 ts 向每个左部点连 (s,x,1),每个右部点向 t(x,t,1),二分图上的边都是左部点向右部点连 (u,v,1),求出最大流即为最大匹配。

用 Dinic 实现复杂度为 O(nm)

栗题 NOI2009 变换序列

容易把问题转化为给定左部点度数均为 2 的二分图,求左部点对应匹配点字典序最小的完美匹配。

先考虑把能确定的都确定下,也就是考虑度数为一的右部点,将其与对应的左部点匹配,然后删掉。如果出现零度点则无解。

这样子剩余的左部点和右部点个数相等,并且右部点的度数都 2(出现度数为 0 无解,出现度数为 1 的会被删掉),由于左部点度数都等于 2,说明右部点的度数也都等于 2

所以此时图是若干个环组成的,对于每个环来说,只有两个完美匹配,选取字典序较小的那一个即可。

时间复杂度易做到线性。

覆盖与独立集

二分图最小点覆盖

最小点覆盖:在图中选择尽量少的点使得每条边至少有一条边被选。

König定理:二分图最小点覆盖大小等于最大匹配大小。

这里给出一种最小点覆盖的构造方法:

  • 对于每个右边每个失配点,尝试走增广路,即“一条匹配,一条没匹配...这样交替出现的路径”,将所有走到的点都打上标记,称之为标记点。
  • 左侧的标记点和右侧的未标记点组成了最小点覆盖。
  • 证明其是一个点覆盖:如果一条边左右端点都不在点覆盖集里面,则左端点是未标记点,右端点是标记点:如果这条边是匹配边的话,右端点想要被标记必须由左端点标记之后走匹配边标记到右端点,所以对于匹配边来说,要不然两端点都被标记,要不然都不被标记;如果这条边不是匹配边的话,右端点被标记之后会走未匹配边标记左端点。所以不会存在这种情况,其为一个点覆盖。
  • 最小点覆盖的点的个数下界为最大匹配数,因为想要覆盖匹配边就需要最大匹配数个点,还有未匹配边要覆盖,所以点集大小不会比最大匹配数更小。
  • 证明这样得到的点集大小是最大匹配数个:
  • 对于匹配边,要不然两端点都被标记,要不然都不被标记,这样每一个匹配边都会唯一对应一个覆盖点,匹配边上的覆盖点也都会唯一对应上这条匹配边。
  • 对于非匹配边来说,如果其右端点是标记点,使得左右端点都打上了标记,那么左端点是覆盖点也一定是匹配点,要不然就找到了一条增广路;如果其右端点不是标记点,其一定为覆盖点,也一定是匹配点,因为如果不是匹配点就会作为路径起点而被标记。这样就说明覆盖点和匹配边构成了一组双射,覆盖点的个数即为匹配边的个数。

感觉我的说明还是比较细致(麻烦),ix35说的就比较简略,但其实细节上自己推推都能推出来。

二分图最大独立集

最大独立集:在图中选出尽量多的点使得其导出子图不含边。

对于任意一张无向图,有如下定理成立:

定理:最大独立集大小与最小点覆盖大小之和等于点数。

任何一组独立集选择状态取反之后都为一组点覆盖(对于一条边,独立集是两端点至多选一个,点覆盖值两端点至少选一个),所以独立集和点覆盖是一一对应的。

二分图是特殊的无向图,所以其在二分图中也是成立的。

应用的话大概就是在一些求最大/最小个数的题目中,通过建模转化成二分图最大独立集/最小点覆盖的问题。比较常见的就是棋盘黑白染色模型。

经典栗题:洛谷 P3355 骑士共存问题洛谷 P5030 长脖子鹿放置,前者是直接的棋盘黑白染色模型,后者则是需要略微观察找出二分图的棋盘模型。

二分图最小边覆盖

最小边覆盖:用最少的边覆盖所有的点。

定理:最小边覆盖大小等于最大独立集大小

考虑最小边覆盖的下界:由于最大独立集两两之间没有边相连,所以一条边至多能覆盖掉最大独立集中的一个点,所以最小边覆盖大小 最大独立集大小。

构造得到这个下界:先选出所有的匹配边,对于所有的未匹配点,选出任意一条与之相连的边,这样一共选了总点数减去最大匹配数条边,即为最大独立集大小。

有向无环图最小路径覆盖

给定简单 DAG,我们要选出其中数目最小的(经过的点)不相交的路径,使得每个点至少在一条路径上。

对于 DAG G=(V,E),构造二分图 H,其中 H 左右各 |V| 个点,如果 (x,y)E,则将 H 左侧编号为 x 的点和右侧编号为 y 的点相连。

定理:DAG G 的最小路径覆盖大小等于 |V| 减去 H 的最大匹配数。

现在构造对 G 的路径覆盖和 H 的匹配构造一个双射:

  • 对于 G 的一个路径覆盖,考虑一条路径 v0,v1,...,vk,则在 H 中将左侧的 vi 和右侧的 vi+1 匹配。由于路径两两不相交,所以每个点的入度和出度 1,所以选出来的是一个匹配。
  • 对于 H 的一组匹配,用类似的方法得到 G 的一个路径覆盖:初始时每个点都没有边经过,视为一条空的路径经过,对于每一个匹配边,在 G 中将其左侧点作为终点的路径拼接上其右侧点作为起点的路径。这样不会出现冲突,因为由于其为一个匹配,所以如果一个点被作为起(终)点拼接,它不会给另外一个点作为起(终)点拼接。

观察将 H 的匹配映射到 G 的路径覆盖的过程中,每一个匹配边都会使得 G 中的两条路径合并,那么 H 的最大匹配得到的就是 G 的最小路径覆盖。合并了 x 次,那么 G 中路径覆盖大小就是 |V|x,定理得证。

栗题:[CTSC 2008] 祭祀

给定简单有向无环图 G=(V,E),求最大的 AV 使得 x,yA,不存在 xy 的路径。

|V|100,|E|1000

将 DAG 传递闭包后得到一个偏序集,即如果 a 可以到达 bab.根据 Dilworth 定理,最长反链长度(两两不可比的最大集合)等于最小链划分大小(划分成尽量少的两两可比的集合),所以答案即为传递闭包后的最小路径覆盖大小。

二分图最大权匹配

费用流做法

建立源点 s 和 汇点 ts 向每个左部点连流量为 1,费用为 0,每个右部点向 t 连流量为 1,费用为 0,二分图上的边都是左部点向右部点连流量为 1,费用为权值,求出最大费用最大流即为最大权匹配。

Hall 定理

对于二分图 G=(V,E),令 N(v) 表示与点 v 相邻的点集,则关于最大匹配,我们有如下结论:

Hall 定理:设二分图 G 的两部分别为 X,Y|X||Y|,则其存在一个大小为 |X| 的匹配(存在完美匹配)当且仅当 SX,有 |S||vSN(v)|

必要性(显然):S 中连出去的边数不足需要的边数,也就是|vSN(v)|<|S|,那么一定不会存在完美匹配。

充分性:假设最大匹配不是完美匹配,那么左部点集合 X 中至少有一个未匹配点 x,从这个 x 开始尝试走增广路,维护左部点集合 S 和右部点集合 T

  • 每次走到一个新的 x,加进 S 中,由于满足 Hall 定理条件,x 一定有一个相邻的点 y,满足其不在 T 中。如果其为未匹配点,则找到增广路,和最大匹配的假设矛盾;否则,将 y 加进 T 中,对于 y 的匹配点 x 递归判断。

S 每次都会加进去一个新的点,而总的点数是有限的,所以最终一定会推得矛盾,充分性得证,则 Hall 定理得证。

Hall 定理的简单推论:

推论:若一个无向图每个点度数都为 k,则称其为 k 正则图,那么左右点数相等的 k 正则二分图必有完美匹配(k1).

证明:则考虑任意一个左部点集 L,若不满足 Hall 定理,其所有的点的邻居组成的集合 R 满足 |R|<|L|RL 之间的边共有 |L|×k 条,所以 R 的度数和 |R|×k|L|×k;又由于 |R|<|L|,则 |R|×k<|L|×k,推得矛盾。所以这张图满足 Hall 定理,有完美匹配。

Hall 定理推广:设二分图 G 的两部分别为 X,Y,则其最大匹配为 |X|max(|S||vSN(v)|)

证明和 Hall 定理类似:

f(S)=|S||vSN(v)|

必要性:对于任意一个 S,其至少有 f(S) 个点不能匹配,则整张图至少有 max(f(S)) 个点不能匹配。设其为 k

充分性:假设最大匹配 <|X|k 也就是最大匹配中有 >k 个左部点是非匹配点,对于其中任意的 (k+1) 个非匹配点构成的集合 S,尝试从这些点开始走增广路,维护左部点集合 S 和右部点集合 T,不断递归进行以下操作:

  • 由于 |S||vSN(v)|k,所以至少存在一个右部点 y 满足其不在 T 中。若 y 是非匹配点,则找到一个增广路,与最大匹配的假设矛盾;否则将 y 加进 T,对于和 y 匹配的点 x,加进 S,递归判断。

每次都会加进一个新的点,而点数是有限的,所以最终会推出矛盾。充分性得证,则结论得证。

网络流

网络

对于一个有向图 G=(V,E),每条边 (u,v)E 都有一个权值 c(u,v),称之为容量,当 (u,v)E 的时候 c(u,v)=0,有两个特殊的点,称之为源点 sV,和汇点 tV,其中 st

f(u,v) 定义在二元组 (uV,vV) 上的实数函数满足:

  1. 容量限制:f(u,v)c(u,v)
  2. 斜对称性:f(u,v)=f(v,u)
  3. 流守恒性:xV{s,t},u,xsinEf(u,x)=(x,v)Ef(x,v)

f 为网络 G 的流函数,整个网络的流量即为从源点出发的所有流量之和。

最大流 费用流 最小割

具体的做法众所周知,于是就不写了!

记一下复杂度:

求解最大流复杂度

Dinic 最坏复杂度为 O(n2m),事实上远远达不到这个上界。

对于求解类似二分图匹配问题时,所有边的流量均为 1,且除了源点和汇点外的所有点,都满足入边最多只有一条,或出边最多只有一条,这样的网络称之为单位网络,对于单位网络 Dinic 复杂度为 O(nm)

求解费用流复杂度

SSP 算法:最坏 O(nmf) 复杂度,其中 f 是最大流。

定理:最小割等于将每条边的代价转换成其容量后 st 的最大流。

首先先将 s 无法到达的点和无法到达 t 的点删去,不影响最大流和最小割的值。

对于一组割,将 V 分成两个不相交子集 L,R,其中 Ls 能流到的点集,R 为能流到 t 的点集,{(u,v)|uL,R} 一定是一组割,而且任意割一定能找到一个子集可以表示为这种形式。所以最小割一定可以表示成这种形式。

由于任意流都需要从 LR,必须经过这些边,所以任意流 任意割。

对于最大流,将残量网络上的点分成 s 能到达的点集 L,以及 L 的补集 R。则 {(u,v)|uL,vR} 一定都是满流的,其构成一组割,此时最大流 这组割。又由于任意流 任意割,所以这组割是最小割。

最小割的方案

在做完最大流之后求出残量网络中 s 可以到达的点集 L,其余的点构成的集合为 R,则所有 (u,v) 满足 uL,vR,则所有的 (u,v) 构成了一组最小割。

但是最小割可能存在很多种,我们定义一条边为可行边为存在一组最小割使得这条边被割断,必经边定义为在每组最小割中这条边都被割断。

考虑暴力判断每一条边:

  • 若删掉 (u,v,w) 这条边,最小割的大小减少 w,则这条边是可行边;
  • 若将 (u,v,w) 这条边权值改为 +,最小割变大,则这条边是必经边。

考虑更快地判断,在 G 跑完最大流的残量网络 G 上讨论:

命题:一条边 (u,v,w) 是最小割可行边,当且仅当这条边满流,并且 G 上不存在 uv 的路径。

  • 若不满流,退掉的流 <w,再加上有可能还会有增广路,那么最小割大小减少的量一定 <w
  • 若满流且 G 存在 uv 的路径,那么将这条边删掉之后还会有增广路,最小割大小减小的量 <w
  • 同理,若满流且 G 不存在 uv 的路径,将这条边删掉之后没有增广路,最小割大小减小的量 =w,其为可行边。

命题:一条边 (u,v,w) 是最小割必经边,当且仅当 G 上存在 suvt 的路径。

其实网上找到的命题还要满足满流,我想了一下如果 G 上存在 suvt 的路径,那么这条边一定满流,否则就出现了一条增广路。

注意到若满足此条件,将 (u,v,w) 这条边权值改为 +,产生增广路,最小割变大,则这条边是必经边。

定理:将 G 进行缩点,则边 (u,v,w) 是可行边当且仅当满流且 u,v 在不同 SCC,是必经边当且仅当满流且 s,u 在同一 SCC,且 v,t 在同一 SCC。

这里的 G 是指将残量网络中没有满流的边视作有向边,也就是删掉已经满流的边。

证明的话利用反向边讨论即可:

  • (u,v,w) 满流,那么其反向边 vu 存在于 G 中,则存在 uv 的路径等价于 u,v 在同一 SCC。所以边 (u,v,w) 是可行边当且仅当满流且 u,v 在不同 SCC;
  • (u,v,w) 满流,说明一定存在 su 的流,其路径上的反向边在其中,所以 G 存在 us 的路径,那么 G 存在 su 的路径等价于 su 在同一 SCC 中。同理,G 存在 vt 的路径等价于 vt 在同一 SCC 中。

综上,定理得证。

根据以上定理,可以得到以下判断最小割方案的方式:

求出最大流,在残量网络上进行缩点,连接不同 SCC 的满流边是可行边,连接 s 所在 SCC 和 t 所在 SCC 的满流边是必经边。

也就是 [AHOI2009]最小割

二分图最大匹配方案与可行边(点)必经边(点)

感觉没什么用,就不记了。遇到再来补。

最小割求最大权闭合子图

定义:有一个有向图,每一个点都有一个权值(可以为正或负或 0),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合子图。

转化成最小割问题:

建立超级源点 s 和汇点 t.

s 向每个正权点连边,流量为权值的绝对值。这条边存在代表该点所选子图中。

每个负权点向 t 连边,流量为权值的绝对值。这条边存在代表该点不在所选子图中。

原图边的流量均为 + (不能被割掉)。

求该网络的最小割,即可求出最大权闭合子图包含哪些点。

最大权闭合子图的权值 = 正权和 最小割。

合法性

st 连通时,选出的子图不满足条件。假设有一条增广路,sijt,则 i 被选中,j 没有被选中,不符合限制。

st 不连通时,选出的子图满足条件。对于任意一个 si

  • i 的后继负节点到 t 的边被割掉了,它们被选中了;

  • 由于已经割掉了 i 的所有后继负节点,i 的后继正节点一定无法走到 t,割掉它们与 s 的边是不优的,最小割不会把它们割掉,所以 i 的所有后继正节点都被选中了。

最优性

根据前面的讨论,任意一个合法的割都对应着唯一一个选点方案;任意一个合法的选点方案都对应着唯一一个割。

这样任意一个割和选点方案都组成了一个双射。由于一个选点方案的权值 = 正权和 割的大小。

所以最大权闭合子图的权值 = 正权和 最小割。

上下界网络流

上下界顾名思义就是对于每条边流过的流量,不仅有上界 c(u,v),还存在下界 b(u,v)(至少要流过多少流量)。也就是流函数 f 要满足 b(u,v)f(u,v)c(u,v)

可以有以下分类:

  • 无源汇和有源汇:因为有上下界,所以网络可以保持流量平衡而没有源点和汇点,这一类成为无源汇上下界网络流。
  • 可行流,最大流,最小流,费用流。

无源汇上下界可行流

给定一张上下界网络图,求一种合法的流量函数,使得每个点都满足流量守恒。

考虑将其转化成无下界即普通的最大流问题。

对于每一条边,假装其流了 b(u,v),那么剩余能流的就是 c(u,v)=c(u,v)b(u,v),但是这样流量不一定守恒,于是考虑每个点 x 出流量与入流量的差 M,并建立超级源点 ST:若 M=0,则出入流量已经守恒;若 M>0,出流量太多了,需要一定的入流量来平衡,于是连边 (S,x,M);若 M<0,入流量太多了,需要一定的出流量来平衡,于是连边 (x,T,M)

这样求出 ST 的最大流,如果新加的边是满流,就说明这个点可以保持流量平衡,否则就不能保持流量平衡。若所有点都保持流量平衡即求出一个可行流,否则不存在可行流。

有源汇上下界可行流

添加一条边 (t,s,+) 即可转化成无源汇上下界可行流。

有源汇上下界最大流

看看有没有可行流,如果有的话删掉所有附加边在残量网络上再跑一次最大流(这次只有上界了),将可行流和最大流相加即为答案。

不会证明正确性,也没找到。

也可以二分答案,将 ts 的边下界设为 m 转成可行流问题。

有源汇上下界最小流

类似最大流,考虑将残量网络中不需要的流退掉,在残量网络上跑一次 ts 的最大流,将可行流减去最大流即为答案。

不会证明正确性,也没找到。同理也可以二分答案。

有(无)上下界最小(大)费用可行(最大)流

和上面的都一样,把最大流换成费用流。

有负环的费用流

对于价值为负数的边 (u,v,c,w),先假装这条边流满了,答案费用加上 c×w,然后建反边 (v,u,c,w),这样就都是正权边了。

但是流量可能不平衡,那就用上下界网络流的思想建立超级源点 S 和超级汇点 T,和多流出或者多流入的点连边即可。

如果原问题是有源汇无源汇,流量有无下界,进一步的解决方法和之前讨论到的都是一样的。


终于把基础的东西都写完了,待补的还有二分图最大权匹配的KM算法,这个感觉还用不到,也有可能是没什么用,等以后再学吧。

posted @   do_while_true  阅读(267)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

This blog has running: 1845 days 1 hours 33 minutes 20 seconds

点击右上角即可分享
微信分享提示