KM算法

KMP算法的实现示例(伪代码) KMP算法,即Knuth-Morris-Pratt算法,是一个线性时间复杂度的字符串匹配算法。它能在O(n+m)的时间复杂度内完成一个长度为n的文本串S和一个长度为m的模式串T的匹配工作,其中n和m分别代表文本串和模式串的长度。相比于朴素字符串匹配算法(暴力匹配),KMP算法通过减少不必要的比较次数,提高了匹配效率。 阅读详情

  1. // S是未匹配的顶点集  
  2. while (M 不是 Mp)  
  3. {  
  4.     //F(S)是Gf中与S中顶点相邻的顶点集  
  5.     if( F(S)==T )  
  6.     {  
  7.         d = min( f[u]+f[w]-weight[u][w] ); //u in S, w not in T  
  8.         for each v in V  
  9.         {  
  10.             if ( v in S )  
  11.                 f[v]=f[v]-d;  
  12.             else  
  13.             if ( v in T )  
  14.                 f[v]=f[v]-d;  
  15.           
  16.         }     
  17.     }  
  18.     else //   
  19.     {  
  20.         w = F(S)-T中一个顶点  
  21.         if ( w未匹配 )  
  22.         {  
  23.             P是刚找到的增大路径  
  24.             M = M与P的对称差分运算结果  
  25.             S是某个未匹配的顶点  
  26.             T= null       
  27.         }  
  28.         else  
  29.         {  
  30.             S=S+ {M中w的相邻点}  
  31.             T=T+w         
  32.         }  
  33.     }  
  34. }  
 

 

最后给一个代码,跟伪代码的思路不是很一样。从网上找的

[cpp]  view plain copy
  1. #include <cstdio>  
  2. #include <memory.h>  
  3. #include <algorithm>    // 使用其中的 min 函数  
  4. using namespace std;  
  5. const int MAX = 1024;  
  6. int n;                // X 的大小  
  7. int weight [MAX] [MAX];        // X 到 Y 的映射(权重)  
  8. int lx [MAX], ly [MAX];        // 标号  
  9. bool sx [MAX], sy [MAX];    // 是否被搜索过  
  10. int match [MAX];        // Y(i) 与 X(match [i]) 匹配  
  11. // 初始化权重  
  12. void init (int size);  
  13. // 从 X(u) 寻找增广道路,找到则返回 true  
  14. bool path (int u);  
  15. // 参数 maxsum 为 true ,返回最大权匹配,否则最小权匹配  
  16. int bestmatch (bool maxsum = true);  
  17. void init (int size)  
  18. {  
  19.     // 根据实际情况,添加代码以初始化  
  20.     n = size;  
  21.     for (int i = 0; i < n; i ++)  
  22.         for (int j = 0; j < n; j ++)  
  23.             scanf ("%d", &weight [i] [j]);  
  24. }  
  25.   
  26. bool path (int u)  
  27. {  
  28.     sx [u] = true;  
  29.     for (int v = 0; v < n; v ++)  
  30.         if (!sy [v] && lx[u] + ly [v] == weight [u] [v])  
  31.         {  
  32.             sy [v] = true;  
  33.             if (match [v] == -1 || path (match [v]))  
  34.             {  
  35.                 match [v] = u;  
  36.                 return true;  
  37.             }  
  38.         }  
  39.         return false;  
  40. }  
  41. int bestmatch (bool maxsum)  
  42. {  
  43.     int i, j;  
  44.     if (!maxsum)  
  45.     {  
  46.         for (i = 0; i < n; i ++)  
  47.             for (j = 0; j < n; j ++)  
  48.                 weight [i] [j] = -weight [i] [j];  
  49.     }  
  50.     // 初始化标号  
  51.     for (i = 0; i < n; i ++)  
  52.     {  
  53.         lx [i] = -0x1FFFFFFF;  
  54.         ly [i] = 0;  
  55.         for (j = 0; j < n; j ++)  
  56.             if (lx [i] < weight [i] [j])  
  57.                 lx [i] = weight [i] [j];  
  58.     }  
  59.     memset (match, -1, sizeof (match));  
  60.     for (int u = 0; u < n; u ++)  
  61.         while (1)  
  62.         {  
  63.             memset (sx, 0, sizeof (sx));  
  64.             memset (sy, 0, sizeof (sy));  
  65.             if (path (u))  
  66.                 break;  
  67.             // 修改标号  
  68.             int dx = 0x7FFFFFFF;  
  69.             for (i = 0; i < n; i ++)  
  70.                 if (sx [i])  
  71.                     for (j = 0; j < n; j ++)  
  72.                         if(!sy [j])  
  73.                             dx = min (lx[i] + ly [j] - weight [i] [j], dx);  
  74.             for (i = 0; i < n; i ++)  
  75.             {  
  76.                 if (sx [i])  
  77.                     lx [i] -= dx;  
  78.                 if (sy [i])  
  79.                     ly [i] += dx;  
  80.             }  
  81.         }  
  82.     int sum = 0;  
  83.     for (i = 0; i < n; i ++)  
  84.         sum += weight [match [i]] [i];  
  85.     if (!maxsum)  
  86.     {  
  87.         sum = -sum;  
  88.         for (i = 0; i < n; i ++)  
  89.             for (j = 0; j < n; j ++)  
  90.                 weight [i] [j] = -weight [i] [j];         // 如果需要保持 weight [ ] [ ] 原来的值,这里需要将其还原  
  91.     }  
  92.     return sum;  
  93. }  
  94.   
  95. int main()  
  96. {  
  97.     freopen ("in.txt", "r", stdin);  
  98.     int n;  
  99.     scanf ("%d", &n);  
  100.     init (n);  
  101.     int cost = bestmatch (true);  
  102.     printf ("%d /n", cost);  
  103.     for (int i = 0; i < n; i ++)  
  104.     {  
  105.         printf ("Y %d -> X %d /n", i, match [i]);  
  106.     }  
  107.     return 0;  
  108. }  
  109. /* 
  110. 5 
  111. 3 4 6 4 9 
  112. 6 4 5 3 8 
  113. 7 5 3 4 2 
  114. 6 3 2 2 5 
  115. 8 4 5 4 7 
  116. //执行bestmatch (true) ,结果为 29 
  117. */  
  118. /* 
  119. 5 
  120. 7 6 4 6 1 
  121. 4 6 5 7 2 
  122. 3 5 7 6 8 
  123. 4 7 8 8 5 
  124. 2 6 5 6 3 
  125. //执行 bestmatch (false) ,结果为 21 
  126. */  
 

二分图的最佳完美匹配——KM算法 二分图的最佳完美匹配如果二分图的每条边都有一个权(可以是负数),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最佳完美匹配。(特殊的,当所有边的权为1时,就是最大完备匹配问题) 我们使用KM算法解决该问题。KM(Kuhn and Munkres)算法,是对匈牙利算法的一种贪心扩展,如果对匈牙利算法还不够明白,建议先重新回顾一下匈牙利算法。KM是对匈牙利算法的一种贪心扩展,这种贪心不是对边的权 阅读详情

相关推荐

【学习总结匈牙利算法到KM算法】

目录匈牙利算法匈牙利算法代码小结参考 匈牙利算法 匈牙利算法代码 小结 参考

AutoXTruck专栏 4749

KM算法--学习笔记

博客推荐:KM算法详解 我对KM算法的理解 二分图的最佳完美匹配--KM算法 1、KM算法是用于寻找带权二分图最佳匹配的算法。对KM算法的描述,基本上可以概括成以下几个步骤: (1) 初始化可行标杆 (2) 用匈牙利算法寻找完备匹配 (3) 若未找到完备匹配则修改可行标杆 (4) 重复(2)(3)直到找到相等子图的完备匹配 2、二分图详解: (1)二...

yangss123的博客 1万+

KM算法入门

KM算法入门 在学习KM算法前,我们先感受一下匈牙利算法(由匈牙利数学家Edmonds提出)。 匈牙利算法 解决何种问题的呢 匈牙利算法是解决二分图的最大匹配度问题。 何为二分图 如果用染色法来判断的话,那么整幅图最后只会有两种颜色的元素;所谓二分图,就是可以划分为两个集合,且同一集合中的元素是互不相连的,不同集合中的元素是可以相连的。 下面我们通过一个简单的例子来说明: 现在...

weixin_43984457的博客 4808

网络流 增广路 入门很好的文章

Edmonds_Karp 算法 (转) 找了好久终于在这个牛这里找到为什么反向边要加回流量的原因了, 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明。也尽量给出了较为完整的代码。 本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们。本文的目的是,解释基本的网络流模型,最基础的最大流求法,即bfs找增广路法,也就是EK法,全名是Edmond...

weixin_30706691的博客 1140

匈牙利算法及KM算法详解

文章目录1 二分图相关概念2 匈牙利算法求解无权二分图最大匹配2.1 相关概念2.2 算法原理2.3 匈牙利算法代码3 KM算法求解加权二分图最优匹配3.1 相关概念3.3 KM代码示例 1 二分图相关概念 二分图定义: 二分图又称双分图、二部图、偶图,指顶点可以分成两个不相交的集U和V(U和V皆为独立集(Independent Sets)),使得在同一个集内的顶点不相邻(没有共同边)的图。 我们定义匹配点、匹配边、未匹配点、非匹配边。如图3中,1、4、5、7为匹配点,其他顶点为未匹配点;1-5、4-7为

zack_liu的博客 4899

km算法入门

本文知识均由笔者自学,文章有错误之处请不吝指出。 笔者刷数模题的时候有一道题考到了“二分图最大权分配”,需要用到KM算法,但是书上对KM算法的介绍又臭又长,更何况有些同学“匈牙利算法”也没学过(由匈牙利数学家Edmonds提出),自然难以理解所谓的KM算法。本文旨在用通俗易懂的语言,向读者介绍匈牙利算法和KM算法。 一、匈牙利算法 匈牙利算法用于解决什么问题? 匈牙利算法用于解...

weixin_30745553的博客 1485

soj1303 KM算法

这是一道典型应用KM算法的二分带权图最大匹配问题,第一次学习KM算法,有许多不懂得地方,参考了博客http://www.cnblogs.com/wenruo/p/5264235.html的详解,稍微懂了一点,把源代码翻译成了伪代码,如下Algorithm KM(map[][], n) Input: map[][], a two dimension array that records the

h1052020748的博客 290

KM算法 入门——[kuangbin]KM匹配

KM算法 入门——[kuangbin]KM匹配

Sega_hsj 's Blog 4232

hdu 1853 Cyclic Tour KM

#include <stdio.h> #include <string.h> #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; int link[M],lx[M],ly[M],slack[M]; //lx,ly为顶标,nx,ny分别为x点集y点集的个数 int visx[M],visy[...

amily05200的博客 152

km算法C++实现

km算法的C++实现,以及调用DEMO,通过取邻接矩阵的相反数可以实现最小权匹配

黑马程序员Pink的javaScript课程APIday4

本文摘要:介绍了JavaScript中日期对象的实例化方法(有参/无参)及三种获取时间戳的方式。讲解了DOM节点操作,包括节点查找(父、子、兄弟节点)、增加/克隆/删除节点的方法。详细说明了移动端touch事件和Swiper插件的使用,包括自动播放和小圆点配置。最后提及学成在线案例中表单验证和取消默认跳转的实现。

JLY19970726的博客 825

KM算法详解

参考: https://www.cnblogs.com/logosG/p/logos.html http://www.mamicode.com/info-detail-2527621.html https://blog.youkuaiyun.com/songbai1997/article/details/82014828 KM算法(Kuhn-Munkres),用来求带权二分图的最大权匹配(最优匹配)。 一、KM算法详解 1. 问题思考 示例:如果一个公司里每个员工做每件工作的效率各不相同,我们如何得到一.

lemonxiaoxiao的博客 2万+

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7797

KM算法原理+证明

介绍 以匈牙利算法为基础,改善后用于求解带权二分图的求最佳匹配问题 百度百科中有KM算法的介绍,当中有证明过程:百度KM算法 最大权匹配 带权二分图的边权重和最大的匹配,如下图所示,最大和为102 最佳匹配 带权二分图的边权重和最大的完备匹配,如下图所示 显然,最佳匹配和最大权匹配并不一致,但如果把剩下的边补上,并且设置权重为零,那么二者可以统一起来 KM算法 下面讲...

qq_25379821的博客 1万+

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 894

Windows系统下com0com虚拟串口安装与驱动签名禁用全攻略

本文详细介绍了在Windows系统下安装com0com虚拟串口工具的全过程,包括驱动签名问题的解决方法。通过禁用驱动程序强制签名,用户可以顺利安装并使用这款开源工具创建虚拟串口对,适用于软件开发测试、硬件调试等场景。文章还提供了验证虚拟串口功能的实用技巧和常见问题解决方案。

weixin_28720573的博客 386

匈牙利算法 & KM算法

这里写目录标题1. 匈牙利算法(Hungarian Algorithm)2. KM 算法(Kuhn-Munkres Algorithm) Reference: 带你入门多目标跟踪(三)匈牙利算法&KM算法 算法学习笔记(5):匈牙利算法 匈牙利算法(Hungarian Algorithm)与 KM 算法(Kuhn-Munkres Algorithm)主要用于解决一些与二分图匹配有关的问题,这种问题在解决多目标跟踪中的数据关联时会比较常见。 二分图(Bipartite graph) 是一类特殊的图

泠山的博客 6393

去面试游戏测试工程师,面试官看着我的简历呆住了

!我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

MXB1220的博客 7329

KM算法学习总结

匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)都用于求解任务分配问题。 目录基本概念与匈牙利算法KM算法算法过程补充总结 基本概念与匈牙利算法 KM算法中用到了匈牙利算法,可以先阅读下面这篇文章。 匈牙利算法 KM算法 算法过程 1、初始化顶标 为二分图中每个点赋值,称为这个点的顶标。顶标在求解过程中会变化。初始化顶标时,左侧的每个点的顶标都是和它相连的权重最大边的权重,像下面这个例子中,x1x_{1}x1​、x2x_{2}x2​、x3x_{3

weixin_42809924的博客 2653

SAP Fiori 个性化数据持久化实战:从 Personalizer 到 Variant 的完整设计思路

摘要:SAPUI5的Personalization服务用于持久化用户界面交互偏好(如表格列顺序、筛选条件),而非业务数据。它提供两种模式:Direct Mode适合单一实体存储,Container Mode支持多实体和变体管理。开发时需注意数据存储位置差异(本地调试用local storage,生产环境由前端服务器处理),避免与业务数据或Bookmark服务混淆。典型应用场景包括表格布局保存和查询方案管理,需根据需求选择模式。该服务能有效提升Fiori应用的用户体验连续性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 130

手把手教你学Simulink实例--基于Simulink的电力电子系统电池管理系统(BMS)设计与仿真实例

本文详细介绍了基于Simulink的电池管理系统(BMS)设计与仿真全过程。首先阐述了BMS在安全防护、寿命延长和性能优化方面的必要性,分析了新能源汽车、光伏储能等典型应用场景的技术指标要求。接着详细讲解了Thevenin等效电路和多电平电池模型构建方法,并给出SOC估算、故障诊断等核心算法的MATLAB实现代码。通过设计正常充放电、过充保护等多场景仿真测试,验证了系统在SOC跟踪精度(误差<1.5%)和故障响应速度(<10ms)方面的优异性能。文章还提出了参数优化方法和未来AI融合、数字孪生等发展方向,提

xiaoheshang_123的博客 379

KM算法介绍

https://www.nowcoder.com/questionTerminal/467534bcf2254067bacbc5cf5e0b53c3?orderByHotValue=1&page=1&onlyReference=false

u012758488的博客 559

32位快速加法器设计

32位快速加法器设计

好好学习,天天向上 3290

KM算法模板

今天学的KM算法很吃力,但是幸好发现了一个很好的博客,讲解的非常好 KM算法讲解看完这个博客感觉自己好像明白了KM算法 代码也很详细 #include <iostream> #include <cstring> #include<cmath> #include<algorithm> #include <cstdio> using name...

G191018的博客 381

温度PID控制PLC程序

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

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...

算法学习———KM算法

KM算法   用于求二分图的最佳完美匹配   即权值最大的完美匹配 如果你也是个刚来学习KM算法的人     大概的用途肯定还是知道的吧     还是直接说重点吧  首先   理解KM算法前  必须有以下3个概念 1.可行顶标     对于一个赋值二分图G(x,y,e,w)   (x,y  代表二分图的两边顶点标号    e代表边    w代表边的权值  )   我们对两边的每一个顶点

Key的博客 3645

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

KM算法详解[转]

KM算法详解 原帖链接:http://www.cnblogs.com/zpfbuaa/p/7218607.html#_label0 阅读目录 二分图博客推荐 匈牙利算法步骤 匈牙利算法博客推荐 KM算法步骤 KM算法标杆(又名顶标)的引入 KM流程详解 KM算法博客推荐 0.二分图 二分图的概念 二分图又称作二部图,是图论中的一种特殊...

a8233821的博客 863

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: poj3114Countries in War(强连通分量加缩点)
下一篇: poj2186 Popular Cows(tarjan + 缩点)
IT旅行
博客等级 码龄12年 3粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值