一眼的KM,但是建图的时候记得不用的点设为0,点少的一边补齐,这个非常重要,因为KM追求完全匹配,如果无法完全匹配会非常慢

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 105
#define _clr(x) memset(x,-1,sizeof(int)*MAXN) int mp[MAXN][MAXN], match1[MAXN], match2[MAXN];
int KM(int m,int n,int mat[][MAXN],int *match1,int *match2)
{
int s[MAXN],t[MAXN],l1[MAXN],l2[MAXN];
int p,q,i,j,k,ret=0;
for(i=0;i<m;i++)
{
l1[i]=-INF;
for(j=0;j<n;j++)
l1[i]=mat[i][j]>l1[i]?mat[i][j]:l1[i];
if(l1[i]==-INF) return -1;
}
for(i=0;i<n;i++)
l2[i]=0;
_clr(match1);
_clr(match2);
for(i=0;i<m;i++)
{
_clr(t);
p=0;q=0;
for(s[0]=i;p<=q&&match1[i]<0;p++)
{
for(k=s[p],j=0;j<n&&match1[i]<0;j++)
{
if(l1[k]+l2[j]==mat[k][j]&&t[j]<0)
{
s[++q]=match2[j];
t[j]=k;
if(s[q]<0)
{
for(p=j;p>=0;j=p)
{
match2[j]=k=t[j];
p=match1[k];
match1[k]=j;
}
}
}
}
}
if(match1[i]<0)
{
i--;
p=INF;
for(k=0;k<=q;k++)
{
for(j=0;j<n;j++)
{
if(t[j]<0&&l1[s[k]]+l2[j]-mat[s[k]][j]<p)
p=l1[s[k]]+l2[j]-mat[s[k]][j];
}
}
for(j=0;j<n;j++)
l2[j]+=t[j]<0?0:p;
for(k=0;k<=q;k++)
l1[s[k]]-=p;
}
}
for(i=0;i<m;i++)
ret+=mat[i][match1[i]];
return ret;
} int d[205][205];
int main(){
int n,m;
int _; scanf("%d",&_);
while(_--) {
scanf("%d %d",&n,&m);
for(int i = 1; i <= n+m; ++i)
for(int j = 1; j <= n+m; ++j) {
scanf("%d",&d[i][j]);
if(d[i][j] == -1) d[i][j] = INF;
}
for(int k = 1; k <= n+m; ++k) {
for(int i = 1; i <= n+m; ++i) {
for(int j = 1; j <= n+m; ++j) {
d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
}
}
} for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) {
mp[i-1][j-1] = d[i][n+j];
if(mp[i-1][j-1] == INF) mp[i-1][j-1] = 0;
}
}
if(n > m) {
for(int i = 1; i <= n; ++i) {
for(int j = m+1; j <= n; ++j) {
mp[i-1][j-1] = 0;
}
}
}else if(n < m) {
for(int i = n+1; i <= m; ++i)
for(int j = 1; j <= m; ++j) {
mp[i-1][j-1] = 0;
}
} int tt = max(n, m);
printf("%d\n",KM(tt,tt,mp,match1,match2));
}
return 0;
}

“玲珑杯”ACM比赛 Round #4 B Best couple的更多相关文章

  1. “玲珑杯”ACM比赛 Round #12题解&源码

    我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧!                                     A ...

  2. “玲珑杯”ACM比赛 Round #19题解&源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】

    A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT ...

  3. “玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)

    “玲珑杯”ACM比赛 Round #19 Start Time:2017-07-29 14:00:00 End Time:2017-07-29 16:30:00 Refresh Time:2017-0 ...

  4. “玲珑杯”ACM比赛 Round #1

    Start Time:2016-08-20 13:00:00 End Time:2016-08-20 18:00:00 Refresh Time:2017-11-12 19:51:52 Public ...

  5. “玲珑杯”ACM比赛 Round #18

    “玲珑杯”ACM比赛 Round #18 Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00 A -- 计算几何你瞎暴力 Time ...

  6. “玲珑杯”ACM比赛 Round #1 题解

    A:DESCRIPTION Eric has an array of integers a1,a2,...,ana1,a2,...,an. Every time, he can choose a co ...

  7. 玲珑杯”ACM比赛 Round #4 1054 - String cut 暴力。学到了扫描的另一种思想

    http://www.ifrog.cc/acm/problem/1054 问删除一个字符后的最小循环节是多少. 比赛的时候想不出,不知道怎么暴力. 赛后看了别人代码才晓得.唉,还以为自己字符串还不错, ...

  8. “玲珑杯”ACM比赛 Round #18--最后你还是AK了(搜索+思维)

    题目链接   DESCRIPTION INPUT OUTPUT SAMPLE INPUT 1 4 2 1 2 5 2 3 5 3 4 5 5 5 SAMPLE OUTPUT 35 HINT 对于样例, ...

  9. “玲珑杯”ACM比赛 Round #22 E 贪心,脑洞

    1171 - 这个E大概是垃圾桶捡来的 Time Limit:2s Memory Limit:128MByte Submissions:138Solved:45 DESCRIPTION B君在做 CO ...

  10. “玲珑杯”ACM比赛 Round #13 题解&源码

    A 题目链接:http://www.ifrog.cc/acm/problem/1111 分析:容易发现本题就是排序不等式, 将A数组与B数组分别排序之后, 答案即N∑i=1Ai×Bi 此题有坑,反正据 ...

随机推荐

  1. 洛谷 [P1341]无序字母对

    这道题第一眼以为是一道字符串的题,但细想一下是一道求欧拉路的图论题. 把每一对对应关系看成一条边,本题即求这张图上是否存在一个欧拉回路或欧拉路,并要求字典序最小的方案,那么我们在dfs的时候就要从该点 ...

  2. Windows Server 2016-部署RODC只读域控制器

    只读域控制器Read-Only Domain Controller简称RODC.RODC是Windows Server 2008之后引入的一活动目录特性,与其他域控制器一样包含AD数据库,但RODC默 ...

  3. 将你的Python Web程序部署到Ubuntu服务器上

    在本文记录了我在Ubuntu中部署Flask Web站点的过程, 其中包括用户创建.代码获取.Python3环境的安装.虚拟环境设置.uWSGI启动程序设置,并将Nginx作为前端反向代理.希望对各位 ...

  4. ajax调用handler,使用HttpWebRequest访问WCF服务

    引言 随着手机及移动设备的普及,移动端的应用也进入了热潮.以前PC端的门户网站,大多也均推出了适配移动设备的网站或者APP,再差的也注册了个公众号.在移动应用开发中,目前据我所了解到的解决方案有:1. ...

  5. 02-Nginx+MySQL+PHP7

    [安装Nginx] #先安装如下包 yum install gcc gcc-c++ kernel-devel yum -y install pcre-devel openssl openssl-dev ...

  6. Ehcache入门基础

    1.ehcache的简介  EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 2.ehcache入门实例 1.首先先导入 ...

  7. ubuntu16.04~qt 5.8无法输入中文

    编译fcitx-qt需要cmake,安装cmake命令,如果已经安装,请略过. sudo apt-get install cmake 安装 fcitx-libs-dev sudo apt-get in ...

  8. CSS布局(四) float详解

    一.float设计初衷 因为float被设计出来的初衷是用于--文字环绕效果.即,一个图片一段文字,图片float:left之后,文字会环绕图片. <div style="width: ...

  9. java7 - JDK

    一.学习大纲: 1. 熟练使用 JDK 文档 2. 软件包 java.lang 提供利用 Java 编程语言进行程序设计的基础类. 3. 软件包 java.math 提供用于执行任意精度整数算法 (B ...

  10. UVA - 10723 类似LCS

    思路:dp(i, j)表示第一个串前i个字符和第二个串前j个字符需要的最短字符串长度,cnt(i, j)表示第一个串前i个字符和第二个串前j个字符需要的最短字符串的个数. 转移方程: if(s1[i] ...