hdu2853
2024-09-26 11:24:10
题解:
KM算法模板
然后我把另一边加了点
然后写了#define int long long
然后莫名挂。。。
然后去掉就过了
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,a[N][N],slack[N],x,exr[N],exl[N],match[N],visl[N],visr[N];
int dfs(int x)
{
visl[x]=;
for (int i=;i<=n;i++)
if (!visr[i])
{
int k=exl[x]+exr[i]-a[x][i];
if (k==)
{
visr[i]=;
if (!match[i]||dfs(match[i]))
{
match[i]=x;
return ;
}
}
else slack[i]=min(slack[i],k);
}
return ;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
int ans1=;
memset(a,,sizeof a);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&x),a[j][i]=x*;
for (int i=;i<=n;i++)
scanf("%d",&x),ans1+=a[x][i],a[x][i]++;
int kkk=n;n=m;
memset(exl,,sizeof exl);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
exl[i]=max(a[i][j],exl[i]);
memset(match,,sizeof match);
memset(exr,,sizeof exr);
for (int i=;i<=n;i++)
{
for (int j=;j<=n;j++)slack[j]=1e9;
while ()
{
memset(visl,,sizeof visl);
memset(visr,,sizeof visr);
if (dfs(i))break;
int d=1e9;
for (int j=;j<=n;j++)
if (!visr[j])d=min(d,slack[j]);
for (int j=;j<=n;j++)
{
if (visl[j])exl[j]-=d;
if (visr[j])exr[j]+=d;
else slack[j]-=d;
}
}
}
int ans=;
for (int i=;i<=m;i++)
ans+=a[match[i]][i];
printf("%d %d\n",kkk-ans%,(ans-ans1)/);
}
}
最新文章
- transient关键字的用法
- makefile中的target到底代表什么?
- GCC 编译选项(转)
- 对iOS中MVC的理解
- Asp.net多行文本框随内容增加而高度增加
- vs2013提交github代码
- Spark编程模型及RDD操作
- solr query的post方式
- 5.两分钟让你明白app后端有啥用
- JavaScript Object中的函数assign
- Ordering Tasks
- 关于ionic如何到最新版本
- web service 部 分
- HTTP协议中源端口和目标端口的问题
- Timeout in android httpclient
- Microsoft Dynamics CRM4.0 和 Microsoft Dynamics CRM 2011 JScript 方法对比
- 【bug】使用微信分享SDK,配置成功但分享信息异常
- typora快捷键之速成笔记
- 河南省队选拔 HAOI2015 解题报告
- 寄存器简介 与 ebp esp