Assignment HDU - 2853(二分图匹配 KM 新边旧边)
传送门:
Assignment
题意:题意直接那松神的题意了。给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率。然后他已经给你了每个公司的分配方案,让你求出最多能增大多少效率(即最大权值匹配减去原来的),然后问你至少要修改多少个关系(即修改多少条边)
思路:关键在于最小修改的老边,很巧妙的将老边和新边的权值做了修改,使得并且不改变km里面的顺序,可以说是很巧妙的了。之后就就直接跑km的板子就好了,挺好的题目,难在新旧边的处理。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<stack>
#include<map>
#include<cstdlib>
#include <vector>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3+;
int nx,ny,k;
int g[maxn][maxn];
int linker[maxn],lx[maxn],ly[maxn];
int slack[maxn];
bool visx[maxn],visy[maxn];
map<pair<int,int>,int>mp;
bool dfs(int x)
{
visx[x] = true;
for(int y=;y<=ny;y++)
{
if(visy[y])
continue;
int tmp = lx[x] + ly[y] -g[x][y];
if(tmp == )
{
visy[y] = true;
if(linker[y] == - || dfs(linker[y]))
{
linker[y] = x;
return true;
}
}
else if(slack[y] > tmp)
slack[y] = tmp;
}
return false;
}
int KM()
{
memset(linker,-,sizeof linker);
memset(ly,,sizeof ly);
for(int i=;i<=nx;i++)
{
lx[i] = -INF;
for(int j=;j<=ny;j++)
{
if(g[i][j] > lx[i])
lx[i] = g[i][j];
}
}
for(int x = ;x <= nx ;x++)
{
for(int i=;i<=ny;i++)
slack[i] = INF;
while(true)
{
memset(visx,false,sizeof visx);
memset(visy,false,sizeof visy);
if(dfs(x))
break;
int d = INF;
for(int i = ;i <= ny;i ++ )
if(!visy[i] && d > slack[i])
d = slack[i];
for(int i = ;i <= nx; i++)
if(visx[i])
lx[i] -= d;
for(int i = ; i <= ny; i++)
{
if(visy[i])
ly[i] += d;
else
slack[i] -= d;
}
}
}
int res = ;
for(int i = ; i <= ny; i++)
if(linker[i] != -)
res += g[linker[i]][i];
return res;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
mp.clear();
memset(g,,sizeof g);
for(int i=;i<=n;i++) {
for (int j = ; j <= m; j++) {
int a;
scanf("%d", &a);
mp[make_pair(i, j)] = a;
g[i][j] = a * (n + );
}
}
int sum = ;
for(int i=;i<=n;i++)
{
int b;
scanf("%d",&b);
g[i][b] += ;
sum += mp[make_pair(i,b)];
}
nx = n;
ny = m;
int ans = KM();
printf("%d %d\n",n-ans%(n+),ans/(n+)-sum);
} }
Assignment HDU - 2853(二分图匹配 KM 新边旧边)的更多相关文章
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- 牛客多校第五场 E room 二分图匹配 KM算法模板
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...
- hdu 2063 二分图匹配
题意:一些女的和一些男的有好感,有好感的能一起坐过山车,问最多能组成多少对 hdu 11 页上少有的算法题,二分图匹配问题,匈牙利算法,对于每一个汉子,看和他有好感的妹子有没有配对了,没有配对过就可以 ...
- hdu1853 Cyclic Tour (二分图匹配KM)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- hdu 1281 二分图匹配
题目:在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下.但是某些格子若不放子,就 无法保证放尽量多的“车”,这样的格子被称做重要点 ...
- Assignment (HDU 2853 最大权匹配KM)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 二分图匹配--KM算法
Kuhn-Munkres算法 KM算法,求完备匹配下的最大权匹配,时间复杂度O(\(n^3\)) 所谓的完备匹配就是在二部图中,x点集中的所有点都有对应的匹配 且 y点集中所有的点都有对应的匹配 ,则 ...
- 模板——二分图匹配KM
具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471 主要讲一些注意点: 1:不直接将未匹配的y减小是因为要保 ...
- hdu 4185 二分图匹配
题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 .... ...
随机推荐
- Java实例学习——企业进销存管理系统(2)
Java实例学习--企业进销存管理系统(2) (本实例为书上实例,我所记录的是我的学习过程) 开始时间:2月12日 完成时间:暂未完成 2月15日-系统登录 对于昨天新建的12个Java包不能完全显示 ...
- Arduino连接SHT10温湿度传感器--返回值不正常解决办法
如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...
- springcloud中servcie层调用fegin异常以及异步方法的实现
近日在做业务上的短信推送和APP消息推送,通过调用别的模块的接口来实现,在springcloud中通过fegin进行调用.这里要说明的事情并不是如何开发推送功能,而是在调试过程中碰到的一些小问题.我把 ...
- hibernate课程 初探单表映射3-5 hibernate增删改查
本节简介: 1 增删改查写法 2 查询load和查询get方法的区别 3 demo 1 增删改查写法 增加 session.save() 修改 session.update() 删除 session. ...
- metaclass元类解析
一.创建类的流程 二.什么是元类 在Python3中继承type的就是元类 示例 # 方式一 class MyType(type): '''继承type的就是元类''' def __init__(se ...
- 超链接显示网站 A,访问后进入网站 B
#前端黑魔法# 出一个思考题:如何用最少的字符实现下图效果.即超链接显示网站 A,访问后进入网站 B. 当然这个是上古时代的黑魔法了,稍懂前端的都知道原理.所以这里只问最短的实现~ 一个简单的演示:( ...
- Google pieCharts的学习
在公司项目开发过程中, 尤其是在网站的开发过程中,用到很多的前端的插件,在这里, 我简单介绍下近期Google pieCharts的是使用方法 https://developers.google.co ...
- 慎用python的pop和remove方法
申明:转载请注明出处!!! Python关于删除list中的某个元素,一般有两种方法,pop()和remove(). 如果删除单个元素,使用基本没有什么问题,具体如下. 1.pop()方法,传递的是待 ...
- SQL 使用触发器常见错误
今天做代码审查时,看见以下一段触发器的创建脚本,我们一起来分析一下 create trigger [trigger_puClassRoomType] on [dbo].[puClassRoomType ...
- 流媒体 6——MPEG电视
1.电视图像的数据率 1.1 ITU-R BT.601标准数据率 按照奈奎斯特(Nyquist)采样理论,模拟电视信号经过采样(把连续的时间信号变成离散的时间信号)和量化 (把连续的幅度变成离散的幅度 ...