#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<queue>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
typedef long long LL;
const int int_max = 0x07777777;
const int int_min = 0x80000000;
const int maxn = 5000;
int w[100][100];
int lx[100],ly[100],biaoji[100];
int x[100], y[100];
void update(){
int d = int_max;
for(int i = 0; i < man.size(); i++){
if (x[i]==1) {
for(int j = 0; j < house.size(); j++){
if (y[j]==0 && d > w[i][j]-lx[i]-ly[j]) {
d = w[i][j]-lx[i]-ly[j];
}
}
}
}
for(int i = 0; i < man.size(); i++){
if (x[i]==1) {
lx[i] += d;
}
if (y[i]==1) {
ly[i] -= d;
}
}
}
bool find (int xx){
x[xx] = 1;
for (int i = 0; i < house.size(); i++) {
if (w[xx][i]==lx[xx]+ly[y] && y[i]==0) {
y[i] = 1;
if (biaoji[i]==-1 || find(biaoji[i])) {
biaoji[i] = xx;
return true;
}
}
}
return false;
}
void km (){
for(int i = 0; i < man.size(); i++){
int result = int_max;
for(int j = 0; j < house.size(); j++){
if (result > w[i][j]) {
result = w[i][j];
}
}
lx[i] = result;
}
for(int i = 0; i < house.size(); i++){
ly[i] = 0;
biaoji[i] = -1;
}
for(int i = 0; i < man.size(); i++){
while (true) {
for(int j = 0; j < man.size(); j++){
x[j] = 0;
y[j] = 0;
}
if (find(i)) {
break;
}else{
update();
}
}
}
}
完全匹配-最小匹配
最新推荐文章于 2023-08-17 11:36:52 发布