博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-2255 奔小康赚大钱 最大权值匹配
阅读量:5301 次
发布时间:2019-06-14

本文共 1873 字,大约阅读时间需要 6 分钟。

题意:此乃第一道真正意义上的最大权值匹配,其他题目其实都是求一个最小权值匹配。

代码如下:

#include 
#include
#include
#include
#include
using namespace std;const int INF = 0x3f3f3f3f;int N;int w[305][305];int lx[305], ly[305];int sx[305], sy[305];int match[305], slack[305];int path(int u) { sx[u] = 1; for (int i = 1; i <= N; ++i) { if (sy[i]) continue; int t = lx[u] + ly[i] - w[u][i]; if (!t) { sy[i] = 1; if (!match[i] || path(match[i])) { match[i] = u; return true; } } else { slack[i] = min(slack[i], t); } } return false;}void KM() { memset(match, 0, sizeof (match)); memset(ly, 0, sizeof (ly)); memset(lx, 0, sizeof (lx)); for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { lx[i] = max(lx[i], w[i][j]); } } for (int i = 1; i <= N; ++i) { memset(slack, 0x3f, sizeof (slack)); while (1) { memset(sx, 0, sizeof (sx)); memset(sy, 0, sizeof (sy)); if (path(i)) break; int d = INF; for (int j = 1; j <= N; ++j) { if (!sy[j]) d = min(d, slack[j]); } for (int j = 1; j <= N; ++j) { if (sx[j]) lx[j] -= d; if (sy[j]) ly[j] += d; else slack[j] -= d; } } } int ret = 0; for (int i = 1; i <= N; ++i) { ret += w[match[i]][i]; } printf("%d\n", ret);}int main() { while (scanf("%d", &N) != EOF) { for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { scanf("%d", &w[i][j]); } } KM(); } return 0; }

 

转载于:https://www.cnblogs.com/Lyush/archive/2013/04/16/3024443.html

你可能感兴趣的文章
WEB前端面试题查询整理
查看>>
【CodeForces - 598D】Igor In the Museum(bfs)
查看>>
Spark-Mllib中各分类算法的java实现(简易教程)
查看>>
给你的HTTPS添加Let's Encrypt证书
查看>>
2014年总结
查看>>
图解分析mochiweb web server
查看>>
netstat 2
查看>>
as3.0 [Embed]标签嵌入外部资源
查看>>
Python 发 邮件
查看>>
mysql忘记密码的解决办法
查看>>
全面分析Java的垃圾回收机制2
查看>>
ssh中文乱码解决
查看>>
Day1:初识Python
查看>>
[Code Festival 2017 qual A] C: Palindromic Matrix
查看>>
[Python设计模式] 第11章 迪米特法则——最少知识原则
查看>>
社交网站怎么利用好等级制度
查看>>
修改博客园css样式
查看>>
centOs-安装java
查看>>
计算机
查看>>
非常喜欢的两段小代码
查看>>