题解:

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的更多相关文章

  1. POJ3686 The Windy's 【费用流】*

    POJ3686 The Windy’s Description The Windy’s is a world famous toy factory that owns M top-class work ...

  2. POJ-3686 The Windy's KM算法 拆点题

    参考:https://blog.csdn.net/sr_19930829/article/details/40680053 题意: 有n个订单,m个工厂,第i个订单在第j个工厂生产的时间为t[i][j ...

  3. POJ3686 The Windy's(最小费用最大流)

    题目大概说要用m个工厂生产n个玩具,第i个玩具在第j个工厂生产要Zij的时间,一个工厂同一时间只能生成一个玩具,问最少的用时. 这题建的图不是很直观.. 源点向玩具连容量1费用0的边 将每个工厂拆成n ...

  4. POJ3686 The Windy's

    嘟嘟嘟 刚做费用流,思路完全不对呀-- 应该这么想(应该说敢这么想):这道题的关键在于怎么体现这个玩具是第几个加工的,只有这才能求出他的加工时间(因为加工时间包括等待时间). 但等待时间不好求,因此要 ...

  5. POJ3686:The Windy's——题解

    http://poj.org/problem?id=3686 题目大意: 有n个订单m个厂子,第i个订单在第j个厂子所需时间为zij,一个厂子做一个订单时不能做其他的订单. 求订单平均时间最小值. — ...

  6. [poj3686]The Windy's(费用流)

    题目大意: 解题关键:指派问题,待更. #include<cstdio> #include<cstring> #include<algorithm> #includ ...

  7. ACM训练计划step 2 [非原创]

    (Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...

  8. [bzoj1070][SCOI2007]修车——费用流

    题目大意: 传送门 题解: 本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,<挑战程序设计竞赛>一 ...

  9. BZOJ1070:[SCOI2007]修车——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 https://www.luogu.org/problemnew/show/P2053#sub ...

随机推荐

  1. httpfs的使用

    在项目中使用到hdfs作为存储,为了在不同的节点加载hdfs上的数据,我们使用nfsv3服务,在客户端使用 root来mount hdfs上的数据到本地,然后把本地的数据发到hdfs上,因为这个我们的 ...

  2. Eclipse 导入Maven 项目报错

    新建Maven项目时出错:org.apache.maven.archiver.MavenArchiver.getManifest   新建Maven项目时出错:org.apache.maven.arc ...

  3. java.lang.OutOfMemoryError: PermGen space异常及解决

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 ...

  4. Axure的总结

    1.Axure的用途      Axure RP 能帮助网站需求设计者,快捷而简便的创建基于网站构架图的带注释页面示意图.操作流程图.以及交互设计,并可自动生成用于演示的网页文件和规格文件,以提供演示 ...

  5. union遇上ntext数据类型

    http://www.myhack58.com/Article/html/3/7/2011/31392.htm

  6. svn不提交.net项目中的bin

    1 选中 bin->右击->tortoiseSVN->add to ignore list->选择第二个 2 提交 , 服务器上就没有bin目录了.

  7. 在linux环境下安装python3.6

    wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz --no-check-certificat gunzip Python-3. ...

  8. Android studio通过连接蓝叠模拟器大幅提高速度!

    因为我的电脑是X200,集成显卡,不支持Opengl 2.0,很多安卓模拟器都不能用(夜神.海马玩,mumu等)最后发现蓝叠. 首先WIN+R,CMD,输入ADB,如果没有命令信息,说明我们需要在PA ...

  9. xtrabackup备份脚本

    背景:现网环境全备份脚本:基于xtrabackup命令 #!/bin/sh # MySQL端口 PORT=' # 备份用户 USER='bkpuser' PAWD='bkpuser' Time=`da ...

  10. Job流程:决定map个数的因素

    此文紧接Job流程:提交MR-Job过程.上一篇分析可以看出,MR-Job提交过程的核心代码在于 JobSubmitter 类的 submitJobInternal()方法.本文就由此方法的这一句代码 ...