poj3686
题解:
KM算法
把每一个点拆成n个
然后改变编圈
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
char s[],q[N][];
int cnt,a[N][N],z,e,cas,b[N*N];
int visr[N],T,x,y,exl[N],exr[N],visl[N],match[N],slack[N],n,m;
int in(char s[])
{
for (int i=;i<=cnt;i++)
if (q[i][]==s[])return i;
q[++cnt][]=s[];
return cnt;
}
int dfs(int x)
{
visl[x]=;
for (int i=;i<=m;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 km()
{
memset(exl,,sizeof exl);
memset(exr,,sizeof exr);
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)exl[i]=max(exl[i],a[i][j]);
memset(match,,sizeof match);
for (int i=;i<=m;i++)
{
memset(slack,0x3f,sizeof slack);
while ()
{
memset(visl,,sizeof visl);
memset(visr,,sizeof visr);
if (dfs(i))break;
int d=1e9;
for (int j=;j<=m;j++)
if (!visr[j])d=min(d,slack[j]);
for (int j=;j<=m;j++)
if (visl[j])exl[j]-=d;
for (int j=;j<=m;j++)
if (visr[j])exr[j]+=d;
else slack[j]-=d;
}
}
int ans=,flag=;
for (int i=;i<=m;i++)ans+=a[match[i]][i];
return ans;
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&n,&m,&e);
cnt=;
memset(q,,sizeof q);
for (int i=;i<=n;i++)
{
scanf("%s",s);
b[i]=in(s);
}
while (e--)
{
cnt=;
memset(q,,sizeof q);
memset(a,,sizeof a);
for (int i=;i<=n;i++)
{
scanf("%s",s);
a[b[i]][in(s)]++;
}
printf("%.4lf\n",(double)km()/n);
}
}
}
poj3686的更多相关文章
- POJ3686 The Windy's 【费用流】*
POJ3686 The Windy’s Description The Windy’s is a world famous toy factory that owns M top-class work ...
- POJ-3686 The Windy's KM算法 拆点题
参考:https://blog.csdn.net/sr_19930829/article/details/40680053 题意: 有n个订单,m个工厂,第i个订单在第j个工厂生产的时间为t[i][j ...
- POJ3686 The Windy's(最小费用最大流)
题目大概说要用m个工厂生产n个玩具,第i个玩具在第j个工厂生产要Zij的时间,一个工厂同一时间只能生成一个玩具,问最少的用时. 这题建的图不是很直观.. 源点向玩具连容量1费用0的边 将每个工厂拆成n ...
- POJ3686 The Windy's
嘟嘟嘟 刚做费用流,思路完全不对呀-- 应该这么想(应该说敢这么想):这道题的关键在于怎么体现这个玩具是第几个加工的,只有这才能求出他的加工时间(因为加工时间包括等待时间). 但等待时间不好求,因此要 ...
- POJ3686:The Windy's——题解
http://poj.org/problem?id=3686 题目大意: 有n个订单m个厂子,第i个订单在第j个厂子所需时间为zij,一个厂子做一个订单时不能做其他的订单. 求订单平均时间最小值. — ...
- [poj3686]The Windy's(费用流)
题目大意: 解题关键:指派问题,待更. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
- ACM训练计划step 2 [非原创]
(Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...
- [bzoj1070][SCOI2007]修车——费用流
题目大意: 传送门 题解: 本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,<挑战程序设计竞赛>一 ...
- BZOJ1070:[SCOI2007]修车——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 https://www.luogu.org/problemnew/show/P2053#sub ...
随机推荐
- POJ - 3308 Paratroopers (最小点权覆盖)
题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...
- eclipse 编译的时候 自动把SDK需要放入libs里面的so文件给删除了
解决方法: 右击Project,选Properties->Builders, 把CDT Builder 关掉. 这样就不会编译了.包括c++的代码也不会编译.. 治标不治本啊...以后c++代码 ...
- ansible一些基本操作
一.介绍 特性 (1).no agents:不需要在被管控主机上安装任何客户端: (2).no server:无服务器端,使用时直接运行命令即可: (3).modules in any languag ...
- 字符编码的发展(ASCII、Unicode、utf-8)
最近一直在看廖雪峰老师的python网上教程,python内容简单易理解,就没整理,但是字符串编码作为一直困扰自己的问题,看了几遍文章,最终还是将其整理如下,本篇博客总结自廖雪峰老师的网上教程:htt ...
- Ubuntu16.04桌面版 连接到ftp服务器
Ftp服务器在不同的网段,需要临时添加网段 不同网段临时添加方法: root@xzrs:/home/rxf# ip addr add 10.1.2.127/24 dev enp0s25 电脑左侧“连接 ...
- java 2017/6/26杂记
mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下: new File("/tmp/one/two/three").mkdirs(); 执行后, 会建 ...
- 20145327 《Java程序设计》第九周学习总结
20145327 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无需接触底层 ...
- 20145333 《Java程序设计》第5周学习总结
20145333 <Java程序设计>第5周学习总结 教材学习内容总结 语法与继承架构 使用try.catch Java中所有错误都会被包装成对象,可以尝试(try)执行程序并捕捉(cat ...
- linux共享内存简单介绍以及编码演示
共享内存的基本概念 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 下图是共 ...
- ubuntu 18.04在更新软件库时出现E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease is not valid yet...
1.完整的错误信息如下: E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease i ...