实用算法实现-第 23 篇 最大流

最大流问题之FF算法与EK算法 目录 问题描述: EK算法: 算法描述: 伪代码: 例子: 控制台对应输出为: 关键定理证明: 最大流最小割定理: 1推2: 2推3: 3推1: 时间复杂度分析 分析 关键边定义: 时间复杂度计算: FF算法: FF算法介绍 FF算法缺陷分析: 问题描述: G=(V,E)是一个有向图,其中每条边(u,v)有一个非负的容量值c(u,v),而且如果E中包含一条边... 阅读详情

23.1    Ford-Fullkerson方法

使用BFS来实现Ford-Fullkerson方法中的找增广路径的算法称为Edmods-Karp算法。Edmods-Karp算法是最短增广路算法,因为实用BFS找到的增广路径是所有可能的增广路径中最短的路径。它的复杂度是O(VE­­2­),其中V是结点数,E是有向边数。

如果用使用DFS代替BFS,则Ford-Fullkerson方法退化成一般增广路算法。其复杂度是O(E| f* |)。其中f*是算法找出的最大流。

23.2    最大流的Edmods-Karp算法

23.2.1   实例

PKU JudgeOnline, 1273, Drainage Ditches.

23.2.2   问题描述

给出M个点然后给出N条边的最大流量,求最大流。

23.2.3   输入

54

12 40

14 20

24 20

23 30

3 4 10

23.2.4   输出

50

23.2.5   分析

基本的最大流算法Edmonds-Karp就可以完成。

PKU JudgeOnline, 3436, ACM Computer Factory也是基本的最大流问题,只是构图需要花一点时间。

23.2.6   程序

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAX   0x7FFFFFFF
int route[201][201];
int c[201][201];
int f[201][201];
struct queue{
     int parent;
     int node;
};
queuequeue[2000];
int last;
int visited[201];
int M;
void EdmondsKarp()
{
     int i, j;
     int temp;
     int from,to;
     intpointer;
     int minC;
     int parent;
     while(1){
         memset(visited, 0, sizeof(visited));
         last = 0;
         queue[last].parent = 0;
         queue[last++].node = 1;
         pointer = -1;
         for(i =0; i < last; i++){
              //BFS,找增广路径
              temp = queue[i].node;
              for(j= 1; j <= M; j++){
                   if((visited[j]== 0)&&
                       (c[temp][j] != 0))
                   {
                       visited[j] = 1;
                       queue[last].node = j;
                       queue[last++].parent = i;
                       if(j == M){
                            //到达汇结点,找到一条增广路径
                            pointer = last - 1;
                            break;
                       }
                   }
              }
              if(pointer!= -1)
              {
                   break;
              }
         }
         if(pointer== -1)
         {
              //没有找到增广路径
              break;
         }
         minC = MAX;
         temp = pointer;
         while(temp!= 0){
              //计算增光路径的流
              parent = queue[temp].parent;
              from = queue[parent].node;
              to = queue[temp].node;
              if(minC> c[from][to]){
                   minC = c[from][to];
              }
              temp = parent;
         }
         temp = pointer;
         while(temp!= 0){
              //修改残留网络
              parent = queue[temp].parent;
              from = queue[parent].node;
              to = queue[temp].node;
              c[from][to] = c[from][to] - minC;
              c[to][from] = c[to][from] + minC;
              f[from][to] = f[from][to] + minC;
              f[to][from] = -f[from][to];
              temp = parent;
         }
     }
}
int main()
{
     int N;
     int i;
     int temp;
     int from,to;
     int flow;
     while(cin>> N >> M){
         memset(c, 0, sizeof(c));
         memset(route, 0, sizeof(route));
         memset(f, 0, sizeof(f));
         for(i =0; i < N; i++){
              cin >> from >> to;
              cin >> temp;
              route[from][to] += temp;
              c[from][to] = route[from][to];
         }
         EdmondsKarp();
         flow = 0;
         for(i =2; i <= M; i++)
         {
              flow += f[1][i];
         }
         cout << flow << endl;
     }
}


23.3    二分图的最小点权覆盖集算法

最小点权覆盖集(minimum weight vertexcovering set,MinWVCS)是在带点权无向图G中,点权之和最小的点覆盖集。

二分图的最小点权覆盖集问题可以转化成最小割问题。以下图为例:

图一

 

图二

    图一中的二分图的最小点权覆盖问题可以通过如上的方法转换为最小割问题。其中不和源或者汇连接的边的权值为∞。具体的证明参见《最小割模型在信息学竞赛中的应用》。

23.3.1   实例

PKU JudgeOnline, 3308, Paratroopers.

23.3.2   问题描述

有外星人入侵地球。已知外星人入侵的坐标,要将他们全部消灭。在横向(或者纵向)上可以布置武器,横向的武器能把整行的外星人消灭。横向(或者纵向)上每个坐标布置武器的花销已知。总代价是所有武器费用的乘积。求最小的总代价。

首先输入测试数据个数T。第二行输入行数、列数、外星人总数。接着一行输入每行代价。接着一行输入每列代价。接着几行输入外星人着陆的行号和列号。

输出总的代价,保留四位小数点。

23.3.3   输入

1

44 5

2.07.0 5.0 2.0

1.52.0 2.0 8.0

11

22

33

44

1 4

23.3.4   输出

16.0000

23.3.5   分析

这个问题和PKU JudgeOnline, 3041,Asteroids.比较相似。只不过3041是求最小点覆盖,这里每个点还带上了权。

这个问题很容易地归为二分图的最小点权覆盖问题。首先问题可以转化为对每个外星人可以从横向也可以从纵向上杀死,但是一定要杀死,这就是覆盖问题。然而需要注意的是,这里要求的是最小的武器费用的乘积,而最小点权覆盖问题求的是最小的权之和。将每个武器的费用取对数,问题就变成了要求的是最小的武器费用(取对数后)之和。

       构图完成之后直接采用最大流算法完成即可。

PKU JudgeOnline, 2125, Destroying TheGraph和这个题目很像。不过更困难的是2125还需要找出最小割的边。找最小割的边的方法是DFS遍历残余图。《最小割模型在信息学竞赛中的应用》中在介绍二分图的最小点权覆盖时进行了一些分析。由于最小割可能有多种情况,故此该问题需要Special Judge。

23.3.6   程序

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define MAX   0x7FFFFFFF
#define MIN   0.0000001
double route[201][201];
double c[201][201];
double f[201][201];
struct queue{
     int parent;
     int node;
};
queuequeue[2000];
int last;
int visited[201];
int M;
void EdmondsKarp()
{
     int i, j;
     int temp;
     int from,to;
     intpointer;
     doubleminC;
     int parent;
     while(1){
         memset(visited, 0, sizeof(visited));
         last = 0;
         queue[last].parent = 0;
         queue[last++].node = 0;
         pointer = -1;
         for(i =0; i < last; i++){
              temp = queue[i].node;
              for(j= 0; j <= M; j++){
                   if((visited[j]== 0)&&
                   (c[temp][j] > MIN))
                   //   (c[temp][j] != 0))
                   {
                       visited[j] = 1;
                       queue[last].node = j;
                       queue[last++].parent = i;
                       if(j== M){
                            pointer = last - 1;
                            break;
                       }
                   }
              }
              if(pointer!= -1)
              {
                   break;
              }
         }
         if(pointer== -1)
         {
              break;
         }
         minC = MAX;
         temp = pointer;
         while(temp!= 0){
              parent = queue[temp].parent;
              from = queue[parent].node;
              to = queue[temp].node;
              if(minC> c[from][to]){
                   minC = c[from][to];
              }
              temp = parent;
         }
         temp = pointer;
         while(temp!= 0){
              parent = queue[temp].parent;
              from = queue[parent].node;
              to = queue[temp].node;
              c[from][to] = c[from][to] - minC;
              c[to][from] = c[to][from] + minC;
              f[from][to] = f[from][to] + minC;
              f[to][from] = -f[from][to];
              temp = parent;
         }
     }
}
struct weight{
     doublecost;
     doublelogCost;
};
int main()
{
     int cases;
     int rowNum,columnNum;
     int i, j;
     int l;
     weight row[51];
     weight column[51];
     int from;
     int to; 
     doubleflow;
 
     cin >> cases;
     for(; cases> 0; cases--){
         memset(c, 0, sizeof(c));
         memset(route, 0, sizeof(route));
         memset(f, 0, sizeof(f));
         cin >> rowNum >> columnNum>> l;
         for(i =1; i <= rowNum; i++){
              cin >> row[i].cost;
              row[i].logCost =log10(row[i].cost);
 
              route[0][i] = row[i].logCost;
              c[0][i] = route[0][i];
         }
         for(i =1; i <= columnNum; i++){
              cin >> column[i].cost;
              column[i].logCost =log10(column[i].cost);
 
              from = i + rowNum;
              to = rowNum + columnNum + 1;
              route[from][to] =column[i].logCost;
              c[from][to] = route[from][to];
         }
         M = rowNum + columnNum + 1;
         for(i =0; i < l; i++){
              cin >> from >> to;
              //from =from;
              to = to + rowNum;
              route[from][to] = MAX;
              c[from][to] = route[from][to];
         }
         EdmondsKarp();
         flow = 0;
         for(i =1; i <= M; i++)
         {
              flow += f[0][i];
         }
 
         flow = pow(10.0, flow);
         printf("%.4f\n",flow);
     }
}
 

23.4    最大二分匹配

可以证明最大二分匹配问题可以转化为最大流问题。求最大二分匹配实际上就是求最大流。

二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识)。第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率。匈牙利算法其实很简单,但是网上搜不到什么说得清楚的文章。所以我决定要写一下。

最大流算法的核心问题就是找增广路径(augment path)。匈牙利算法也不例外,它的基本模式就是:

 

初始时最大匹配为空

while 找得到增广路径

do 把增广路径加入到最大匹配中去

 

可见和最大流算法是一样的。但是这里的增广路径就有它一定的特殊性,下面我来分析一下。

(注:匈牙利算法虽然根本上是最大流算法,但是它不需要建网络模型,所以图中不再需要源点和汇点,仅仅是一个二分图。每条边也不需要有方向。)

图1 图2

图1是我给出的二分图中的一个匹配:[1,5]和[2,6]。图2就是在这个匹配的基础上找到的一条增广路径:3->6->2->5->1->4。我们借由它来描述一下二分图中的增广路径的性质:

(1)有奇数条边。

(2)起点在二分图的左半边,终点在右半边。

(3)路径上的点一定是一个在左半边,一个在右半边,交替出现。(其实二分图的性质就决定了这一点,因为二分图同一边的点之间没有边相连,不要忘记哦。)

(4)整条路径上没有重复的点。

(5)起点和终点都是目前还没有配对的点,而其它所有点都是已经配好对的。(如图1、图2所示,[1,5]和[2,6]在图1中是两对已经配好对的点。而起点3和终点4目前还没有与其它点配对。)

(6)路径上的所有第奇数条边都不在原匹配中,所有第偶数条边都出现在原匹配中。(如图1、图2所示,原有的匹配是[1,5]和[2,6],这两条配匹的边在图2给出的增广路径中分边是第2和第4条边。而增广路径的第1、3、5条边都没有出现在图1给出的匹配中。)

(7)最后,也是最重要的一条,把增广路径上的所有第奇数条边加入到原匹配中去,并把增广路径中的所有第偶数条边从原匹配中删除(这个操作称为增广路径的取反),则新的匹配数就比原匹配数增加了1个。(如图2所示,新的匹配就是所有蓝色的边,而所有红色的边则从原匹配中删除。则新的匹配数为3。)

不难想通,在最初始时,还没有任何匹配时,图1中的两条灰色的边本身也是增广路径。因此在这张二分图中寻找最大配匹的过程可能如下:

(1)找到增广路径1->5,把它取反,则匹配数增加到1。

(2)找到增广路径2->6,把它取反,则匹配数增加到2。

(3)找到增广路径3->6->2->5->1->4,把它取反,则匹配数增加到3。

(4)再也找不到增广路径,结束。

当然,这只是一种可能的流程。也可能有别的找增广路径的顺序,或者找到不同的增广路径,最终的匹配方案也可能不一样。但是最大匹配数一定都是相同的。

对于增广路径还可以用一个递归的方法来描述。这个描述不一定最准确,但是它揭示了寻找增广路径的一般方法:

“从点A出发的增广路径”一定首先连向一个在原匹配中没有与点A配对的点B。如果点B在原匹配中没有与任何点配对,则它就是这条增广路径的终点。反之,如果点B已与点C配对,那么这条增广路径就是从A到B,再从B到C,再加上“从点C出发的增广路径”。并且,这条从C出发的增广路径中不能与前半部分的增广路径有重复的点。

比如图2中,我们要寻找一条从3出发的增广路径,要做以下3步:

(1)首先从3出发,它能连到的点只有6,而6在图1中已经与2配对,所以目前的增广路径就是3->6->2再加上从2出发的增广路径。

(2)从2出发,它能连到的不与前半部分路径重复的点只有5,而且5确实在原匹配中没有与2配对。所以从2连到5。但5在图1中已经与1配对,所以目前的增广路径为3->6->2->5->1再加上从1出发的增广路径。

(3)从1出发,能连到的不与自已配对并且不与前半部分路径重复的点只有4。因为4在图1中没有与任何点配对,所以它就是终点。所以最终的增广路径是3->6->2->5->1->4。

但是严格地说,以上过程中从2出发的增广路径(2->5->1->4)和从1出发的增广路径(1->4)并不是真正的增广路径。因为它们不符合前面讲过的增广路径的第5条性质,它们的起点都是已经配过对的点。我们在这里称它们为“增广路径”只是为了方便说明整个搜寻的过程。而这两条路径本身只能算是两个不为外界所知的子过程的返回结果。

显然,从上面的例子可以看出,搜寻增广路径的方法就是DFS,可以写成一个递归函数。当然,用BFS也完全可以实现。

至此,理论基础部份讲完了。但是要完成匈牙利算法,还需要一个重要的结论:

定理:如果从一个点A出发,没有找到增广路径,那么无论再从别的点出发找到多少增广路径来改变现在的匹配,从A出发都永远找不到增广路径。

要用文字来证明这个定理很繁,话很难说,要么我还得多画一张图,我在此就省了。其实你自己画几个图,试图举两个反例,这个定理不难想通的。(给个提示。如果你试图举个反例来说明在找到了别的增广路径并改变了现有的匹配后,从A出发就能找到增广路径。那么,在这种情况下,肯定在找到别的增广路径之前,就能从A出发找到增广路径。这就与假设矛盾了。)

有了这个定理,匈牙利算法就成形了。如下:

 

初始时最大匹配为空

for 二分图左半边的每个点i

do 从点i出发寻找增广路径。如果找到,则把它取反(即增加了总了匹配数)。

 

如果二分图的左半边一共有n个点,那么最多找n条增广路径。如果图中共有m条边,那么每找一条增广路径(DFS或BFS)时最多把所有边遍历一遍,所花时间也就是m。所以总的时间大概就是O(n * m)。

可以转化为最大二分匹配的问题有以下几种:

1. 最小路径覆盖。有向图n个点,求最少的不相交(包括顶点相交)路径,覆盖所有n个结点,输出路径条数。

2. 最小点覆盖。最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。

23.4.1   最小路径覆盖

在一个P*P的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联。(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次)。如果不考虑图中存在回路,那么每每条路径就是一个弱连通子集。

 

由上面可以得出:

1. 一个单独的顶点是一条路径。

2. 如果存在一路径p1,p2,......pk,其中p1 为起点,pk为终点,那么在覆盖图中,顶点p1,p2,......pk不再与其它的顶点之间存在有向边。

最小路径覆盖就是找出最小的路径条数,使之成为P的一个路径覆盖。

路径覆盖与二分图匹配的关系:

最小路径覆盖=|P|-最大匹配数。

其中最大匹配数的求法是把P中的每个顶点pi分成两个顶点pi'与pi'',如果在p中存在一条pi到pj的边,那么在二分图P'中就有一条连接pi'与pj''的无向边。这里pi' 就是p中pi的出边,pj''就是p中pj 的一条入边。

对于公式:最小路径覆盖=|P|-最大匹配数。可以这么来理解:

如果匹配数为零,那么P中不存在有向边,于是显然有:

最小路径覆盖=|P|-最大匹配数=|P|-0=|P|。即P的最小路径覆盖数为|P|。

P'中不在于匹配边时,路径覆盖数为|P|。

如果在P'中增加一条匹配边pi'-->pj'',那么在图P的路径覆盖中就存在一条由pi连接pj的边,也就是说pi与pj 在一条路径上,于是路径覆盖数就可以减少一个。

如此继续增加匹配边,每增加一条,路径覆盖数就减少一条。直到匹配边不能继续增加时,路径覆盖数也不能再减少了,此时就有了前面的公式。但是这里只是说话了每条匹配边对应于路径覆盖中的一条路径上的一条连接两个点之间的有向边。下面来说明一个路径覆盖中的每条连接两个顶点之间的有向边对应于一条匹配边。

与前面类似,对于路径覆盖中的每条连接两个顶点之间的每条有向边pi--->pj,我们可以在匹配图中对应做一条连接pi'与pj''的边,显然这样做出来图的是一个匹配图(这一点用反证法很容易证明,如果得到的图不是一个匹配图,那么这个图中必定存在这样两条边  pi'---pj'' 及 pi' ----pk'',(j!= k),那么在路径覆盖图中就存在了两条边pi-->pj,pi--->pk ,那边从pi出发的路径就不止一条了,这与路径覆盖图是矛盾的。还有另外一种情况就是存在pi'---pj'',pk'---pj'',这种情况也类似可证)。

至此,就说明了匹配边与路径覆盖图中连接两顶点之间边的一一对应关系,那么也就说明了前面的公式成立。

1.4.2   最小点覆盖

König定理是一个二分图中很重要的定理。

König定理:一个二分图中的最大匹配数等于这个图中的最小点覆盖数。

可以证明:最少的点(即覆盖数)= 最大匹配数。

可以比较简单地想:如果有一条边没有被覆盖,也就是有一条边没有和一个覆盖点连接,则可以通过这条边流过流量,也就是这条边的两个端点可以匹配起来作为最大匹配的一对匹配。

 

23.4.3   实例

PKU JudgeOnline, 3041, Asteroids.

23.4.4   问题描述

在N*N的格子里有K个小行星。可以用激光炮把一行或者一列的小行星清除。问最少要发射多少次激光炮。

23.4.5   输入

34

11

13

22

32

23.4.6   输出

2

23.4.7   分析

本题就是要找最小点覆盖,根据König 定理就是求最大二分匹配了。PKU JudgeOnline, 2226, Muddy Fields是这个题目的威力加强版,构图的时候相对麻烦一点。

PKU JudgeOnline, 2771, Guardian of Decency 也是一个找最小点覆盖的问题,可以这样理解:将男女分成两队,能恋爱的连接起来。要求去掉最少的人,让所有的连接断掉。对比上面最小点覆盖的问题,可以发现这个问题就转换成了最小点覆盖问题。

PKU JudgeOnline, 1325,Machine Schedule也是一个找最小点覆盖的问题。

PKU JudgeOnline, 1422, Air Raid是一个最小路径覆盖问题。

23.4.8   程序

#include<string.h>
#include<stdio.h>
#include<iostream.h>
#define MAX_NUM 502
int used[MAX_NUM];   //记录R中结点是否使用
int link[MAX_NUM];   //记录当前与R结点相连的L的结点
int connected[MAX_NUM][MAX_NUM]; //记录连接L和R的边,如果i和j之间有边则为,否则为
//int gn,gm;    //二分图中L和R中点的数目
int numL, numR;
int augmentPath(int t)
{
     int i;
     for(i = 1;i <= numR;i++)
     {
         if(used[i]==0&& connected[t][i])
         {
              used[i]=1;
              if(link[i]== -1 || augmentPath(link[i]))
              {
                   link[i]=t;
                   return1;
              }
         }
     }
     return 0;
}
int MaxMatch()
{
     int i, num;
     num = 0;
     memset(link, 0xff, sizeof(link));
     for(i = 1;i <= numL; i++){
         memset(used, 0, sizeof(used));
         if(augmentPath(i))
         {
              num++;
         }
     }
     return num;
}
int main()
{
     int K, N;
     int i;
     int row,column;
     cin >> N >> K;
     numL = K;
     numR = K;
     memset(connected, 0, sizeof(connected));
     for(i = 1;i < K; i++){
         scanf("%d",&row, &column);
         connected[row][column] = 1;
     }
     cout << MaxMatch();
     return 1;
}

23.5    实例

23.5.1   最大流实例

PKU JudgeOnline, 1273, Drainage Ditches.

PKU JudgeOnline, 3436, ACM Computer Factory.

23.5.2   二分图的最小点权覆盖集算法实例

PKU JudgeOnline, 2125, Destroying TheGraph.

PKU JudgeOnline, 3308, Paratroopers.

 23.5.3   最大二分匹配实例

PKU JudgeOnline, 3041, Asteroids.

PKU JudgeOnline, 2771, Guardian of Decency.

PKU JudgeOnline, 2536, Gopher II.

PKU JudgeOnline, 1274, The Perfect Stall.

PKU JudgeOnline, 2239, Selecting Courses.

PKU JudgeOnline, 1469, COURSES.

PKU JudgeOnline, 1422, Air Raid.

PKU JudgeOnline, 1325, Machine Schedule.

PKU JudgeOnline, 2226, Muddy Fields.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

图像分割之最小割与最大流算法 博客搬家,图片可能显示不正常,请访问:https://imlogm.github.io/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/mincut-maxflow/ 摘要:图像分割中”Graph Cut”、”Grab Cut”等方法都有使用到最小割算法。网上资料介绍了Graph cut和Grab cut中图的构建方法,但对最小割的求解一笔带过。所以萌生了写一篇介绍... 阅读详情

相关推荐

FordFulkerson算法求网络最大流(java)

FordFulkerson算法3个核心的概念:残留网络、增广路径和流网络的割(详细介绍参考算法导论) 所测试的网络结构图如图所示: 第1次遍历在残留网络中找到S->V2->V1->V3->T这条增广路径(下图A),这时的网络流量如图B 执行第2次遍历的时候在残留网络中找到S->V2->V4->T这条增广路径(下图A),这时的网络流量如图B 执行第3次遍历的时候在残留网络中找到S

JavaMan_chen的专栏 7586

【最大流】Ford-Fulkerson算法——算法设计与分析

介绍了最大流问题及其相关概念,通过直观策略引入并介绍了Ford-Fulkerson算法,给出实例讲解。

友人帐_的博客 4296

第5-5课:最大流问题(图文篇)

原计划这一课是要讲解最小费用最大流问题,但是图文课每一篇如果字数太多会给手机阅读带来困难,加上读者圈朋友的反馈希望多讲一些基础的内容,因此这一课我们降低点难度,只讲最大流问题。最小费用最大流问题,其实也是在最大流问题的基础上加入类似最短路径算法(SPFA)这样的思路,叠加形成算法,最后的总结部分我会简单介绍一下在最大流算法的基础上实现最小费用最大流问题的两种常用方法,但是这一课,我们只讲最大...

oRbIt 的专栏 3913

二分图最大匹配和网络最大流的转换

二分图有两部分节点L和R,各部分内部节点之间没有边,即每条边的两个节点都一定分属这两部分,二分图的一个匹配是找到这样一组边,使得每个节点都只有至多一条边与其相连。 二分图的最大匹配问题可以转化为网络最大流问题。增加一个到所有L中顶点容量均为1的源点s和一个所有R中顶点到其容量均为1的汇点t,所有L到R中的边容量也设置为1,现在查找此网络流的最大流就等同于求此二分图的最大匹配。证明过程见算法导

LSS 2339

Claude Code长期记忆:优雅的上下文管理

ClaudeCode的上下文管理系统采用三层架构设计,通过智能压缩和优化策略在记忆容量与性能间取得平衡。系统包含短期记忆(高速工作区)、中期记忆(智能蒸馏器)和长期记忆(持久化知识库)。当Token使用率达到92%阈值时启动wU2压缩器,采用8段式结构化摘要保留关键信息,并配合智能文件恢复和渐进式预警机制。该系统通过分层处理、优雅降级和透明化交互,为AI应用提供了高效可靠的上下文管理方案,展现了在有限资源下实现智能记忆的艺术。

m0_53117338的博客 3817

软件测试面试题汇总

软件测试面试题汇总 测试技术面试题 ........................................................................................................................................................................ 5 1、什么是兼容

晴天的专栏 2万+

FORD-FULKERSON算法

其中w也有流流向了u和v,而这部分流无法流向源点s,因为没有路径,所以最后这部分流量加上s到u和v的流量,在u和v之间无论如何互相传递流,最终都要流向集合T,所以这个流量值是等于s流向u和v的值的。首先,我们必须了解一个特性,根据上一篇文章中讲到的最大流问题的线性规划表示时,提到,流网络的流量守恒的原则,根据这个原则我们可以知道,对网络的任意割,其净流量的都是相等的。举个例子,假设(u,v)当前流量为3/4,那么就是说c(u,v)=4,f(u,v)=3,那么r(u,v)=1。首先介绍下,割的概念。

lockhou的博客 5132

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 873

了解福特-福克森算法

在本教程中,您将学习什么是Ford-Fulkerson算法。此外,您还将找到在C语言的示例。 Ford-Fulkerson算法是一种计算网络或图中最大流量的贪心方法。

运维狗的备忘录 7216

雷达工程师避坑指南:STAP处理中,间歇采样转发干扰为什么这么难对付?

本文深入解析了STAP处理中间歇采样转发干扰(ISRJ)的挑战与应对策略。通过分析ISRJ的工作机制和自由度消耗问题,结合仿真数据对比,揭示了其与传统压制干扰的本质差异。文章还探讨了在工程实践中如何构建有效的防御体系,包括降维处理技术选择和混合架构设计,为雷达工程师提供了实用的避坑指南。

weixin_30530339的博客 268

llama-factory微调qwen2.5-vl

使用llama-factory完成qwen2.5-vl微调

qq_44908396的博客 2933

【算法·命运-23*】最大流

最大流问题(Maximum Flow Problem)是图论中的一个经典优化问题,目标是在给定一个流网络(即一个带有容量的有向图)中,找到从源点 ss 到汇点 tt 的最大流量。流网络中的每条边有一个容量,表示从一端到另一端的最大允许流量。流的一个基本要求是:对于每个节点,进入流量等于流出的流量,除了源点和汇点。最大流问题的一个常见应用场景是:计算网络中最大信息传输量、交通网络中的最大运输能力等。

m0_69378371的博客 1081

PX4实战(四):PX4 uorb模块详解

本节主要讲解PX4中的uorb消息,主要包括uorb的基本概念使用、PX4内重要的uorb消息、如何自定义uorb消息以及使用uorb消息的注意点等,其中讲解重要uorb消息是为了对PX4内重要数据结构有初步的了解,有助于后期算法理解。uORB(micro Object Request Broker)是PX4中用于模块间通信的轻量级发布-订阅(Publish/Subscribe)机制。模块之间可以通过uORB传递消息,无需直接调用对方函数;提高系统模块化与解耦性;

PX4-SLAM-PNC 1931

(图论)最大流算法-7.29讲解

最大流算法 网络流基础概念 网络流 在一个有向图G=(V,E)G=(V,E)中: 有一个唯一的源点S(入度为00:出发点) 有一个唯一的汇点T(出度为00:结束点) 图中的每一条边都一个非负的权值,这个权值叫做容量c(u,v)c(u,v) 满足上述条件的图GG称为网络流图,记为G=(V,E,C)G=(V,E,C) 可以想象成,如果把每条边都看成一个管道,可以看成是水从源点S出发经过这些管道,最终流向汇点T,而每条管道有最大的容量。(地下排水管道) 可行流 流量:每条弧上给定一个实数f(u,v)f(u,v)

qq_45841239的博客 1万+

ANSYS专题-利用ANSYS SIwave进行PCB板的EMS仿真

本文详细描述了使用ANSYSSIwave进行电路板电磁敏感度(EMS)仿真的完整流程。主要步骤包括:导入AD软件生成的IPC2581文件,检查PCB叠层和电路参数,为敏感网络设置50欧姆端口并指定GND为参考网络,进行验证检查后设置频段范围和入射波类型(单/多入射、极化方式等),最后启动仿真并查看选定网络的EMS感应电压曲线。该过程提供了从文件准备到结果分析的全套操作指南,适用于评估电路板在电磁干扰环境下的性能表现。

whm128的博客 3591

[VT虚拟化驱动]利用EPT实现无痕HOOK

本章利用讲EPT无痕HOOK

吾无法无天的博客 1万+

图算法-最大流

形式定义 流网络: 源结点 s,汇点 t,每个结点都在从源结点到汇点的某条路径上 流网络G中的流 是一个实值函数f: V * V -> R 流满足两条性质: (流量守恒:流入结点的总流量等于流出结点的总流量(除源结点与汇点以外)) 流 f 的值 | f | 即从源结点流出的总流量减去流入源结点的总流量 最大流问题 :给定一个流网络G、一个源结点、一个汇点,求值最大的流 残存网络 G_f...

Iam_Human的博客 2466

温度PID控制PLC程序

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

最大流问题(超详细!!!)

0x00 最大流 最大流量问题涉及通过最大单源单汇流网络找到可行流量。如图所示。 每个边缘都标有容量,即可以携带的最大物品数量。 最大流问题是找出可以从顶点source到顶点sink总的物品数量(最大的那个)。 如上图所示,当0->1和2->1汇聚的时候不能超出1->3的值12(1的输出最大为12)。最后可以到达5的最大物品个数就是19+4=23。也就...

coordinate的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【图与网络数学模型】3.Ford-Fulkerson算法求解网络最大流问题

最大流量算法的实际应用仍然既是一门艺术也是一门科学。它的艺术之处在于为特定的应用场景选择最有效的策略;它的科学之处在于对问题本质的理解。

姚巨龙的博客 3072

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

初步网络最大流的算法及详解

                  网络最大流   众所周知,网络流是图论的一个很重要的内容,也很有难度(主要难在建模)。   网络流的基础概念这里提一下:   容量网络:设G(V,E),是一个有向网络,在V中指定了一个顶点,称为源点(记为Vs),以及另一个顶点,称为汇点(记为Vt);对于每一条弧<u,v>属于E,对应有一个权值c(u,v)>0,称为弧的容量.通常...

weixin_30770783的博客 2810

最大流问题以及FF算法

最大流问题问题描述:给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow).约束条件:设 G = (V, E) 是一个流网络,其容量函数为 c。设 s 为网络的源点,t 为汇点。G 的流的一个实值函数 f:V×V → R,且满足下列三个性质:容量限制(Capacity Constrai

王小超的博客 8116

最大流问题:增广路径算法的比较

以下转载于:FordFulkerson算法求网络最大流(java) FordFulkerson算法3个核心的概念:残留网络、增广路径和流网络的割(详细介绍参考算法导论) 所测试的网络结构图如图所示: 第1次遍历在残留网络中找到S->V2->V1->V3->T这条增广路径(下图A),这时的网络流量如图B 执行第2次遍历的时候在残留网络中找到S->V2->V4->T这条增广路径(下图A

DoBit的专栏 4276

最大流最小割经典例题_最大流

在前面的章节我们介绍了很多关于图的无环路应用,比如最短路径、拓扑排序、关键路径等,以及如何使用拓扑排序和DFS检测图中是否有环。本节将介绍一些含环路的图应用,主要是最大流以及求网络中最大流的典型算法Ford-Fulkerson方法、Dinic算法和前置推送-标签重贴方法。很多系统中涉及流量问题,例如公路系统中车流量、网络中的数据信息流、供油管道的油流量等,往往需要求从源节点到目的节点的最大负载,如...

weixin_39875167的博客 3476
上一篇: 实用算法实践-第 22 篇 字符串匹配
下一篇: 实用算法实现-第 24 篇 高精度整数运算
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值