A:一对一配对,两种解法,一种是用二分最大权匹配 km算法可解 ,二是用最大费用最大流,两种都是直接套算法的模板就可以了。
下面给出km的做法
/******************************************************
* File Name: fff.cpp
* Author: kojimai
* Create Time: Thu 26 Mar 2015 08:20:59 PM CST
******************************************************/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 35
#define MAX 0x3f3f3f3f
int len[FFF][FFF];
int sx[FFF],sy[FFF];
int lx[FFF],ly[FFF];
int match[FFF],n;
int bfs(int i) {
sx[i] = 1;
for(int j = 1;j <= n;j++) {
if(!sy[j] && lx[i] + ly[j] == len[i][j]) {
sy[j] = 1;
if(!match[j] || bfs(match[j])) {
match[j] = i;
return 1;
}
}
}
return 0;
}
int km(int n) {
for(int i = 1;i <= n;i++) {
lx[i] = len[i][1];
for(int j = 2;j <= n;j++)
lx[i] = max(lx[i],len[i][j]);
}
memset(ly,0,sizeof(ly));
memset(match,0,siz