| 图与树搜索算法 |
| --- |
| * α–β
* A\*
* B\*（英语：）
* 回溯
* 集束（英语：）
* 贝尔曼-福特
* 最佳优先（英语：）
* 双向
* Borůvka（英语：）
* 分支限界
* BFS
* 大英博物馆
* D\*（英语：）
* DFS
* 深度限制（英语：）
* 迪杰斯特拉
* Edmonds（英语：）
* 弗洛伊德
* 边缘搜索
* 爬山
* IDA\*（英语：）
* 迭代加深
* Johnson（英语：）
* 跳点（英语：）
* 克鲁斯克尔
* 词典BFS（英语：）
* LPA\*（英语：）
* 普里姆
* SMA\*（英语：）
* 最短路径快速
 |
| 
分类 |
| * 图算法
* 搜索算法
* 算法列表（英语：）
 |
| 
相关主题 |
| * 动态规划
* 图的遍历
* 树的遍历
 |
| * 
* 论
* 编
 |

**霍普克洛夫特－卡普算法**（**Hopcroft Karp算法**）是用來解決二分圖最大匹配問題的一種演算法。

在匈牙利算法中，我们每次寻找一条增广路来增加匹配集合M。可以证明，每次找增广路的复杂度是{\mathcal {O}}\left(\left|E\right|\right)，一共需要增广{\mathcal {O}}\left(\left|V\right|\right)次，因此总时间复杂度为{\mathcal {O}}\left(\left|V\right|\left|E\right|\right)。为了降低时间复杂度，在霍普克洛夫特－卡普算法中，我们在增加匹配集合M时，每次寻找多条增广路。可以证明，这样迭代次数最多为2{\sqrt {\left|V\right|}}，所以，时间复杂度就降到了{\mathcal {O}}\left({\sqrt {\left|V\right|}}\left|E\right|\right)。

该算法由約翰·霍普克洛夫特和理查德·卡普于1973年提出。

```
program Project1;
 const maxn=1000;
 var dx,dy,mx,my,q:array[1..maxn]of longint;
 adj:array[1..maxn,0..maxn]of longint;
 n,m,e,i,j,ans,ff,rr:longint;
 function bfs:boolean;
 var i,u,j:longint;
 begin
 bfs:=false;
 fillchar(q,sizeof(q),0);
 rr:=1;
 ff:=1;
 for i:=1 to n do
 if mx[i]=-1
 then begin
 q[ff]:=i;
 inc(ff);
 end;
 for i:=1 to n do dx[i]:=0;
 for i:=1 to m do dy[i]:=0;
 while rr<ff do
 begin
 u:=q[rr];
 inc(rr);
 for j:=1 to adj[u][0]do
 begin
 i:=adj[u][j];
 if dy[i]=0
 then begin
 dy[i]:=dx[u]+1;
 if my[i]=-1
 then bfs:=true
 else begin
 dx[my[i]]:=dy[i]+1;
 q[ff]:=my[i];
 inc(ff);
 end;
 end;
 end;
 end;
 end;
 function dfs(x:longint):boolean;
 var i,j:longint;
 begin
 for j:=1 to adj[x][0]do
 begin
 i:=adj[x][j];
 if dy[i]=dx[x]+1
 then begin
 dy[i]:=0;
 if(my[i]=-1)or dfs(my[i])
 then begin
 mx[x]:=i;
 my[i]:=x;
 exit(true);
 end;
 end;
 end;
 exit(false);
 end;
 begin
 readln(n,m,e);
 for i:=1 to e do
 begin
 readln(ff,rr);
 inc(adj[ff][0]);
 adj[ff][adj[ff][0]]:=rr;
 end;
 for i:=1 to n do mx[i]:=-1;
 for i:=1 to m do my[i]:=-1;
 ans:=0;
 while bfs do
 for i:=1 to n do
 if(mx[i]=-1)and(dfs(i))
 then inc(ans);
 writeln(ans);
 end.

```

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |