#include <iostream>
#include <cstring>
#include <cstdio> using namespace std;
const int MAXN = 305;
const int INF = 0x3f3f3f3f; int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度
int ex_girl[MAXN]; // 每个妹子的期望值
int ex_boy[MAXN]; // 每个男生的期望值
bool vis_girl[MAXN]; // 记录每一轮匹配匹配过的女生
bool vis_boy[MAXN]; // 记录每一轮匹配匹配过的男生
int match[MAXN]; // 记录每个男生匹配到的妹子 如果没有则为-1
int slack[MAXN]; // 记录每个汉子如果能被妹子倾心最少还需要多少期望值 int N; bool dfs(int girl)
{
vis_girl[girl] = true; for (int boy = 0; boy < N; ++boy) { if (vis_boy[boy]) continue; // 每一轮匹配 每个男生只尝试一次 int gap = ex_girl[girl] + ex_boy[boy] - love[girl][boy]; if (gap == 0) { // 如果符合要求
vis_boy[boy] = true;
if (match[boy] == -1 || dfs( match[boy] )) { // 找到一个没有匹配的男生 或者该男生的妹子可以找到其他人
match[boy] = girl;
return true;
}
} else {
slack[boy] = min(slack[boy], gap); // slack 可以理解为该男生要得到女生的倾心 还需多少期望值 取最小值 备胎的样子【捂脸
}
} return false;
} int KM()
{
memset(match, -1, sizeof match); // 初始每个男生都没有匹配的女生
memset(ex_boy, 0, sizeof ex_boy); // 初始每个男生的期望值为0 // 每个女生的初始期望值是与她相连的男生最大的好感度
for (int i = 0; i < N; ++i) {
ex_girl[i] = love[i][0];
for (int j = 1; j < N; ++j) {
ex_girl[i] = max(ex_girl[i], love[i][j]);
}
} // 尝试为每一个女生解决归宿问题
for (int i = 0; i < N; ++i) { fill(slack, slack + N, INF); // 因为要取最小值 初始化为无穷大 while (1) {
// 为每个女生解决归宿问题的方法是 :如果找不到就降低期望值,直到找到为止 // 记录每轮匹配中男生女生是否被尝试匹配过
memset(vis_girl, false, sizeof vis_girl);
memset(vis_boy, false, sizeof vis_boy); if (dfs(i)) break; // 找到归宿 退出 // 如果不能找到 就降低期望值
// 最小可降低的期望值
int d = INF;
for (int j = 0; j < N; ++j)
if (!vis_boy[j]) d = min(d, slack[j]); for (int j = 0; j < N; ++j) {
// 所有访问过的女生降低期望值
if (vis_girl[j]) ex_girl[j] -= d; // 所有访问过的男生增加期望值
if (vis_boy[j]) ex_boy[j] += d;
// 没有访问过的boy 因为girl们的期望值降低,距离得到女生倾心又进了一步!
else slack[j] -= d;
}
}
} // 匹配完成 求出所有配对的好感度的和
int res = 0;
for (int i = 0; i < N; ++i)
res += love[ match[i] ][i]; return res;
} int main()
{
while (~scanf("%d", &N)) { for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
scanf("%d", &love[i][j]); printf("%d\n", KM());
}
return 0;
}

最新文章

  1. 深度学习(DNN)的学习网站
  2. Java特性-动态代理
  3. Svn与Git的一些区别(转载)
  4. scrollview做定时来回滚动时,总出现错位的情况。
  5. Mysql-学习笔记(==》约束 六)
  6. SqlSever基础 top 后面的n 由一个简单的计算式子计算得出
  7. Java练习之最大相同子串
  8. 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
  9. 【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
  10. Scarborough Fair 绝美天籁
  11. MVC3中 ViewBag、ViewData和TempData的使用和区别(不是自己写的)
  12. 最全ASCLL码
  13. 将GridView中的数据导出到Excel代码与注意事项
  14. django note
  15. Linq无聊练习系列8---开放式并发事务,null和 DateTime,string操作练习
  16. [HAOI2008]移动玩具 状压
  17. 搭建node js的运行环境。
  18. javascript基础知识学习
  19. shell命令批量创建指定格式的文件
  20. Apache安全配置基线指导

热门文章

  1. javascript 入门 之select2选择本地数据
  2. 超过百万的StackOverflow Flutter 问题
  3. Exchange 2016 OWA登陆异常
  4. Python入门学习指导(VS Code配置向)
  5. 通过GSM模块发送经纬度求救信息。
  6. springboot项目war包部署及出现的问题Failed to bind properties under 'mybatis.configuration.mapped-statements[0].
  7. AJ学IOS(08)UI之热门_喜马拉雅UI实现-UIScrollView的使用
  8. python教程:使用 async 和 await 协程进行并发编程
  9. UML(续)
  10. [XML] XML格式【有道翻译】API 的数据转化输出