KM匹配模板

 1 int G[N][N];
 2 int lx[N], ly[N];
 3 int slack[N];
 4 int match[N];
 5 bool visitx[N], visity[N];
 6 int n;
 7
 8 bool Hungary(int u)
 9 {
10     visitx[u] = true;
11     for(int i = 0; i < n; ++i)
12     {
13         if(visity[i])
14             continue;
15         else
16         {
17             if(lx[u] + ly[i] == G[u][i])
18             {
19                 visity[i] = true;
20                 if(match[i] == -1 || Hungary(match[i]))
21                 {
22                     match[i] = u;
23                     return true;
24                 }
25             }
26             else
27                 slack[i] = min(slack[i], lx[u] + ly[i] - G[u][i]);
28         }
29     }
30     return false;
31 }
32
33 void KM_perfect_match()
34 {
35     int temp;
36     memset(match, -1, sizeof(match));
37     memset(lx, 0, sizeof(lx));
38     memset(ly, 0, sizeof(ly));
39     for(int i = 0; i < n; ++i)
40         for(int j = 0; j < n; ++j)
41             lx[i] = max(lx[i], G[i][j]);
42     for(int i = 0; i < n; ++i)
43     {
44         for(int j = 0; j < n; ++j)
45                 slack[j] = INT_MAX;
46         while(1)
47         {
48             memset(visitx, false, sizeof(visitx));
49             memset(visity, false, sizeof(visity));
50             if(Hungary(i))
51                 break;
52             else
53             {
54                 temp = INT_MAX;
55                 for(int j = 0; j < n; ++j)
56                     if(!visity[j])
57                         temp = min(temp, slack[j]);
58                 for(int j = 0; j < n; ++j)
59                 {
60                     if(visitx[j])
61                         lx[j] -= temp;
62                     if(visity[j])
63                         ly[j] += temp;
64                     else
65                         slack[j] -= temp;
66                 }
67             }
68         }
69     }
70 }

时间: 2024-12-26 03:13:02

KM匹配模板的相关文章

二分图最大权最小权完美匹配模板KM

在网上找了一份挺好的模板,先标一下哦~链接君:http://blog.csdn.net/abcjennifer/article/details/5844579 #include <iostream> #include <string.h> #include <algorithm> #include <iostream> using namespace std; int max(int a,int b) {return a<b?b:a;} int min

KM算法(最优匹配)

最优匹配看了好多天,哎,就是因为一个细节问题没注意到,不知道网上的讲的不清还是本人智商不够,现在把我的误区说一下吧,顺便讲一下KM 算法,希望看KM算法的知识青年能少走弯路 KM算法是解决最优匹配问题的,关于最优匹配的相关术语网上说的很详细,可以先参考这个网站看下,http://philoscience.iteye.com/blog/1754498,本博客建立在此网站的基础上做的补充,是因为限于时间吧不能写的很详尽,希望对大家能有所帮助. 直入主题吧 最优匹配:举个栗子,比如为每边输入n(n=5

KM算法

hdu2255:奔小康赚大钱 ○| ̄|_○| ̄|_○| ̄|_.终于自己写出来了,虽然是模板题.首先是正确性的证明然后就是O(n^3)的优化,然而我就是这么弱智,弄了一个多小时才弄完: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #d

1076. Trash(KM算法 二分最佳完美匹配)

1076. Trash Time limit: 1.0 second Memory limit: 64 MB You were just hired as CEO of the local junkyard.One of your jobs is dealing with the incoming trash and sorting it for recycling.The trash comes every day in N containers and each of these conta

LA4043 - Ants(二分图完备最佳匹配KM)

option=com_onlinejudge&Itemid=8&page=show_problem&problem=2044">https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2044 大致题意: 平面上有n个白点和n个黑点,求一种完美匹配使他们间的连线不相交 思路:要注意到,若有两种匹

hdoj 3488 Tour 【最小费用最大流】【KM算法】

Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 2299    Accepted Submission(s): 1151 Problem Description In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 3000

hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法

传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子.另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(

【网络流24题】No.18 分配问题 (二分图最佳匹配 费用流|KM)

[题意] 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为 cij . 试设计一个将n 件工作分配给 n 个人做的分配方案, 使产生的总效益最大. 输入文件示例input.txt52 2 2 1 22 3 1 2 42 0 1 1 12 3 4 3 33 2 1 2 1 输出文件示例output.txt514 [分析] 很裸的..二分图最大权匹配. 等一下可以打一下KM... 1 #include<cstdio> 2 #include<cstdlib>

codevs 1028 花店橱窗布置 (KM)

/*裸地KM*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 110 #define inf 0x3f3f3f3f using namespace std; int n,m,ans,match[maxn],w[maxn][maxn],d; int fx[maxn],fy[maxn],lx[maxn],ly[maxn]; bool Dfs(int i) { fx[i]=1; for(