fbpx
维基百科

二分图最佳带权匹配

二分图最佳带權匹配问题是指在给定带权二分图上求出一个最大匹配的问题,使得所有匹配边权值之和最大。这个问题也被称为二分图最优匹配[1]

此类问题通常使用KM算法或转换为一个网络费用流问题进行求解。

定义 编辑

一个带权二分图   中的边   都带有一个权值  。该二分图的一个最佳带权匹配是它所有匹配中,所有匹配边权值之和中最大的一个。

求解方法 编辑

KM算法 编辑

直接使用KM算法求解。

最小费用最大流 编辑

通过建立模型,使用费用流算法解决。

参考程序 编辑

C++ 编辑

#include <cstdio> #include <string.h> #include <vector> #include <algorithm> #include <climits> using namespace std; int const MAX = 1000; int const inf = INT_MAX; int w[MAX][MAX]; int link[MAX];//代表当前与Y集合中配对的X集合中的点 int visx[MAX], visy[MAX]; int lx[MAX], ly[MAX]; int n, m;//代表X和Y中元素的个数   int can(int t) {  visx[t] = 1;  for(int i = 1; i <= m; i++){  if(!visy[i] && lx[t] + ly[i] == w[t][i]){//这里“lx[t]+ly[i]==w[t][i]”决定了这是在相等子图中找增广路的前提,非常重要  visy[i] = 1;  if(link[i] == -1 || can(link[i])){  link[i] = t;  return 1;  }  }  }  return 0; } int km(void) {  int sum = 0; memset(ly, 0, sizeof(ly));  for(int i = 1; i <= n; i++){//把各个lx的值都设为当前w[i][j]的最大值  lx[i] = -inf;  for(int j = 1; j <= n; j++){  if(lx[i] < w[i][j])  lx[i] = w[i][j];  }  }  memset(link, -1, sizeof(link));  for(int i = 1; i <= n; i++){  while(1){  memset(visx, 0, sizeof(visx));  memset(visy, 0, sizeof(visy));  if(can(i))//如果它能够形成一条增广路径,那么就break  break;  int d = inf;//否则,后面应该加入新的边,这里应该先计算d值  for(int j = 1; j <= n; j++)//对于搜索过的路径上的XY点,设该路径上的X顶点集为S,Y顶点集为T,对所有在S中的点xi及不在T中的点yj  if(visx[j])  for(int k = 1; k <= m; k++)  if(!visy[k])  d = min(d, lx[j] + ly[k] - w[j][k]);  if(d == inf)  return -1;//找不到可以加入的边,返回失败(即找不到完美匹配)  for (int j = 1; j <= n; j++)  if (visx[j])  lx[j] -= d;  for(int j = 1; j <= m; j++)  if(visy[j])  ly[j] += d;  }  }  for(int i = 1; i <= m; i++)  if(link[i] > -1)  sum += w[link[i]][i];  return sum; } 

参考文献 编辑

  1. ^ 李煜东. suan fa jing sai jing jie zhi nan. zhong yuan chu ban chuang mei ji tuan - he nan dian zi ying xiang chu ban she. ISBN 978-7-89388-198-5. 

二分图最佳带权匹配, 建議将此條目或章節併入任務分配問題, 討論, 此條目需要編修, 以確保文法, 用詞, 语气, 格式, 標點等使用恰当, 請按照校對指引, 幫助编辑這個條目, 幫助, 討論, 二分图最佳带權匹配问题是指在给定带权二分图上求出一个最大匹配的问题, 使得所有匹配边权值之和最大, 这个问题也被称为二分图最优匹配, 此类问题通常使用km算法或转换为一个网络费用流问题进行求解, 目录, 定义, 求解方法, km算法, 最小费用最大流, 参考程序, 参考文献定义, 编辑一个带权二分图, displaysty. 建議将此條目或章節併入任務分配問題 討論 此條目需要編修 以確保文法 用詞 语气 格式 標點等使用恰当 請按照校對指引 幫助编辑這個條目 幫助 討論 二分图最佳带權匹配问题是指在给定带权二分图上求出一个最大匹配的问题 使得所有匹配边权值之和最大 这个问题也被称为二分图最优匹配 1 此类问题通常使用KM算法或转换为一个网络费用流问题进行求解 目录 1 定义 2 求解方法 2 1 KM算法 2 2 最小费用最大流 3 参考程序 3 1 C 4 参考文献定义 编辑一个带权二分图 G X Y E displaystyle G X Y E nbsp 中的边 u v E displaystyle u v in E nbsp 都带有一个权值 f u v displaystyle f u v nbsp 该二分图的一个最佳带权匹配是它所有匹配中 所有匹配边权值之和中最大的一个 求解方法 编辑KM算法 编辑 直接使用KM算法求解 最小费用最大流 编辑 通过建立模型 使用费用流算法解决 参考程序 编辑C 编辑 include lt cstdio gt include lt string h gt include lt vector gt include lt algorithm gt include lt climits gt using namespace std int const MAX 1000 int const inf INT MAX int w MAX MAX int link MAX 代表当前与Y集合中配对的X集合中的点 int visx MAX visy MAX int lx MAX ly MAX int n m 代表X和Y中元素的个数 int can int t visx t 1 for int i 1 i lt m i if visy i amp amp lx t ly i w t i 这里 lx t ly i w t i 决定了这是在相等子图中找增广路的前提 非常重要 visy i 1 if link i 1 can link i link i t return 1 return 0 int km void int sum 0 memset ly 0 sizeof ly for int i 1 i lt n i 把各个lx的值都设为当前w i j 的最大值 lx i inf for int j 1 j lt n j if lx i lt w i j lx i w i j memset link 1 sizeof link for int i 1 i lt n i while 1 memset visx 0 sizeof visx memset visy 0 sizeof visy if can i 如果它能够形成一条增广路径 那么就break break int d inf 否则 后面应该加入新的边 这里应该先计算d值 for int j 1 j lt n j 对于搜索过的路径上的XY点 设该路径上的X顶点集为S Y顶点集为T 对所有在S中的点xi及不在T中的点yj if visx j for int k 1 k lt m k if visy k d min d lx j ly k w j k if d inf return 1 找不到可以加入的边 返回失败 即找不到完美匹配 for int j 1 j lt n j if visx j lx j d for int j 1 j lt m j if visy j ly j d for int i 1 i lt m i if link i gt 1 sum w link i i return sum 参考文献 编辑 李煜东 suan fa jing sai jing jie zhi nan zhong yuan chu ban chuang mei ji tuan he nan dian zi ying xiang chu ban she ISBN 978 7 89388 198 5 取自 https zh wikipedia org w index php title 二分图最佳带权匹配 amp oldid 67430962, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。