HDU 2853 & 剩余系+KM模板
题意:
给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大。
SOL:
我觉得我的智商还是去搞搞文化课吧。。这种题给我独立做我大概只能在暴力优化上下功夫。。
这题的处理方法让我想到了剩余系。。貌似就是它。。
我们将每条边的边权扩大n+1倍——是不是有点雾,同时将原匹配边的边权再加1.
非常玄学!这样做有什么道理呢?它保证了最优匹配在这样更改后仍是最优的!我们假设次优解比最优解只小1,在乘上n+1后差距被放大到n+1,即使次优解全由原匹配边组成,加上n仍小于最优解,那么我们就一定能求出最优解。同时我们注意到每一条边的边权均为n+1的倍数,而原匹配边的边权为n+1的倍数加1,那么我们就能很方便地求出当前解中有多少原匹配边。
如果原图有多个最优解,那么我们能肯定拥有原匹配边最多的解在乘上n+1后边权最大——毕竟人家加了1嘛。
很巧妙的剩余系转化与运用啊。。数学渣确实已经没救了。
/*==========================================================================
# Last modified: 2016-02-19 13:00
# Filename: hdu2853.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define lowbit(x) (x)&(-x)
#define INF 1070000000
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define maxn 100
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
/*==================split line==================*/
int n,m;
int slack[maxn],lx[maxn],ly[maxn],w[maxn][maxn],link[maxn];
bool S[maxn],T[maxn];
int Ans;
bool match(int i){
S[i]=true;
FORP(j,1,m)
if (!T[j]){
int tmp=lx[i]+ly[j]-w[i][j];
if (tmp==0){
T[j]=true;
if (!link[j] || match(link[j])){
link[j]=i;
return true;
}
}
else slack[j]=min(slack[j],tmp);
}
return false;
}
void updata(){
int a=INF;
FORP(i,1,m) if (!T[i]) a=min(a,slack[i]);
FORP(i,1,n) if (S[i]) lx[i]-=a;
FORP(i,1,m)
if (T[i]) ly[i]+=a;
else slack[i]-=a;
}
void KM(){
memset(lx,0,sizeof(lx));
memset(link,0,sizeof(link));
memset(ly,0,sizeof(ly));
FORP(i,1,n)
FORP(j,1,m) lx[i]=max(lx[i],w[i][j]);
FORP(i,1,n){
memset(slack,0x7f,sizeof(slack));
while (true){
memset(S,false,sizeof(S));
memset(T,false,sizeof(T));
if (match(i)) break;
else updata();
}
}
int ans=0;
FORP(i,1,m) if (link[i]) ans+=w[link[i]][i];
printf("%d %d\n",n-ans%(n+1),ans/(n+1)-Ans/(n+1));
}
int main(){
freopen("a.in","r",stdin);
while (scanf("%d%d",&n,&m)!=EOF){
Ans=0;
FORP(i,1,n)
FORP(j,1,m) {
int x;
scanf("%d",&x);
w[i][j]=x*(n+1);
}
FORP(i,1,n) {int x; scanf("%d",&x); Ans+=w[i][x]; w[i][x]++;}
KM();
}
}
HDU 2853 & 剩余系+KM模板的更多相关文章
- HDU 2853 最大匹配&KM模板
http://acm.hdu.edu.cn/showproblem.php?pid=2853 这道题初看了没有思路,一直想的用网络流如何解决 参考了潘大神牌题解才懂的 最大匹配问题KM 还需要一些技巧 ...
- 【HDU 2853】 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现 ...
- hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...
- 【HDU 2853】Assignment (KM)
Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...
- HDU 2853 Assignment(KM最大匹配好题)
HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...
- Assignment HDU - 2853(二分图匹配 KM 新边旧边)
传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...
- HDU 2853 (KM最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题目大意:二分图匹配费用流.①最大匹配②最小原配变动 解题思路: 如果去掉第二个要求,那么就是裸 ...
- HDU 2255 & KM模板
题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...
- Assignment (HDU 2853 最大权匹配KM)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- mongo数据库的导入导出
http://www.iwangzheng.com/ [root@a02]$show dbs; changhong_tv_cms 0.078GB [root@a02]$ mongodump -d ch ...
- 见招拆招:绕过WAF继续SQL注入常用方法
Web Hacker总是生存在与WAF的不断抗争之中的,厂商不断过滤,Hacker不断绕过.WAF bypass是一个永恒的话题,不少基友也总结了很多奇技怪招.那今天我在这里做个小小的扫盲吧.先来说说 ...
- LBP
参考:http://www.cnblogs.com/mikewolf2002/p/3438698.html
- HTML快速入门2
三.版面风格控制 1. 字体控制 A. 字体大小 用 <font Size=#> 和 </font> 表示,#为字号: 1 - 7 ,缺省为 3 ,可用 <basefon ...
- HDU 2895 编辑距离
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> ...
- HLG2040二叉树遍历已知前中,求后
二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 us ...
- javascript 重写已有的方法
现在有一个需求,需要重写方法,比如方法名为a,但是在方法内部,需要用到原来的方法,怎么办? 最直接的办法是: var b = a; window.a = function(args){ a.call( ...
- 90天打造日均在线网站1W+的友情链接平台
导读:三个月过去了,好友张森终于把一款默默无名的软件打造出了日均1W+在线的平台,我认为成功的因素很简单,1,找准了用户群体的痛点;2,肯花精力做运营;3,合理的推广.本文是他的自述,打造一款产品,说 ...
- mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint.其中比较迷惑的是int和smallint的差别.今天就在网上仔细找了找,找到如下内容, ...
- 转数据库Sharding的基本思想和切分策略
本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 一.基本思想 Sh ...