【BZOJ4205】卡牌配对 最大流
【BZOJ4205】卡牌配对
Description
Input
Output
Sample Input
2 2 2
2 5 5
2 2 5
5 5 5
Sample Output
【提示】
样例中第一张X类卡牌和第一张Y类卡牌能配对,第二张X类卡牌和两张Y类卡牌都能配对。所以最佳方案是第一张X和第一张Y配对,第二张X和第二张Y配对。
另外,请大胆使用渐进复杂度较高的算法!
HINT
题解:这个建模题有点难想~
先只考虑A和B都不互质的情况,因为200以内的质数只有46个,并且每个数所含的不同的质因子不超过3个,所以建46*46个点,每个A中的卡牌向所有自己包含的质数对连边,最多3*3条边。然后在分别考虑其他情况,只需要对A和B,A和C,B和C都建46*46个点即可。然后跑最大流既是答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define P(A,B,C) ((A)*num*num+(B-1)*num+C+T)
using namespace std;
int n1,n2,S,T,cnt,ans,num;
int v[3][10],tp[3];
int pri[210],np[210];
int head[70000],d[70000],to[2000000],next[2000000],val[2000000];
queue<int> q;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void work(int a,int val)
{
tp[a]=0;
for(int i=1;pri[i]*pri[i]<=val;i++)
{
if(val%pri[i]==0)
{
v[a][++tp[a]]=i;
while(val%pri[i]==0) val/=pri[i];
}
}
if(val!=1) v[a][++tp[a]]=np[val];
}
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int dfs(int x,int mf)
{
if(x==T) return mf;
int i,k,temp=mf;
for(i=head[x];i!=-1;i=next[i])
{
if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
}
return mf-temp;
}
int bfs()
{
memset(d,0,sizeof(d));
while(!q.empty()) q.pop();
q.push(S),d[S]=1;
int i,u;
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i])
{
if(!d[to[i]]&&val[i])
{
d[to[i]]=d[u]+1;
if(to[i]==T) return 1;
q.push(to[i]);
}
}
}
return 0;
}
int main()
{
n1=rd(),n2=rd(),S=n1+n2+1,T=n1+n2+2;
int i,j,a,b,c;
for(i=2;i<=200;i++)
{
if(!np[i]) pri[++num]=i,np[i]=num;
for(j=1;j<=num&&i*pri[j]<=200;j++)
{
np[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
memset(head,-1,sizeof(head));
for(i=1;i<=n1;i++)
{
a=rd(),b=rd(),c=rd();
work(0,a),work(1,b),work(2,c),add(S,i,1);
for(a=1;a<=tp[0];a++) for(b=1;b<=tp[1];b++) add(i,P(0,v[0][a],v[1][b]),1);
for(a=1;a<=tp[0];a++) for(b=1;b<=tp[2];b++) add(i,P(1,v[0][a],v[2][b]),1);
for(a=1;a<=tp[1];a++) for(b=1;b<=tp[2];b++) add(i,P(2,v[1][a],v[2][b]),1);
}
for(i=1;i<=n2;i++)
{
a=rd(),b=rd(),c=rd();
work(0,a),work(1,b),work(2,c),add(i+n1,T,1);
for(a=1;a<=tp[0];a++) for(b=1;b<=tp[1];b++) add(P(0,v[0][a],v[1][b]),i+n1,1);
for(a=1;a<=tp[0];a++) for(b=1;b<=tp[2];b++) add(P(1,v[0][a],v[2][b]),i+n1,1);
for(a=1;a<=tp[1];a++) for(b=1;b<=tp[2];b++) add(P(2,v[1][a],v[2][b]),i+n1,1);
}
while(bfs()) ans+=dfs(S,1<<30);
printf("%d",ans);
return 0;
}
【BZOJ4205】卡牌配对 最大流的更多相关文章
- BZOJ4205卡牌配对——最大流+建图优化
题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...
- BZOJ4205 : 卡牌配对
对于两张卡牌,如果存在两种属性值不互质,则可以匹配. 只考虑200以内的质数,一共有46个,可以新建3*46*46个点来表示一类属性值中有这两种质数的卡牌. 然后对于每张卡牌,枚举它的质因子,最多只有 ...
- 【BZOJ4205】卡牌配对
Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且 ...
- [BZOJ4205][FJ2015集训]卡牌配对
题目:卡牌配对 传送门:None 题目大意:有$n_1$张$X$类牌和$n_2$张$Y$类类牌,每张卡牌上有三个属性值:$A,B,C$.两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属 ...
- BZOJ 4205: 卡牌配对
4205: 卡牌配对 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 173 Solved: 76[Submit][Status][Discuss] ...
- [BZOJ4205][FJ2015集训] 卡牌配对 [建图+最大流]
题面 这是bzoj权限题,题面可以去下面的离线题库找 离线4205,只有题面,不能提交 思路 二分图匹配 这道题模型显然就是个二分图匹配嘛 那我们两两判断一下然后连边匹配.....就只有30分了 因为 ...
- 刷题总结——卡牌配对(bzoj4205网络流)
题目: Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值 ...
- DOTA自走棋卡牌及搭配阵容
这个游戏其实就根炉石jjc和A牌轮抽一样,前期要找着质量牌抓,保证你至少不漏.根据你的需求补一些你不会上场的阵容组件,最后根据你的组件和核心紫卡来哪张来决定打什么.另外也要考虑场上另外几家,如果有一家 ...
- Unity3D_(游戏)卡牌01_启动屏界面
卡牌2D游戏展示 (游戏代码放到 卡牌04_游戏界面 文章最后面~) 游戏项目已托管到github上(里面有个32bit可执行文件) 传送门 规则 开始游戏每张卡牌初始翻开展示 展示几秒后卡牌 ...
随机推荐
- 浏览器的DNS缓存查看和清除
有dns的地方,就有缓存.浏览器.操作系统.Local DNS.根域名服务器,它们都会对DNS结果做一定程度的缓存.本文总结一些常见的浏览器和操作系统的DNS缓存时间 浏览器先查询自己的缓存,查不到, ...
- 对Linux文件权限的理解
755,775,777,ugoa 等分别代表什么含义?这些数字是如何得到的? 1.常用的linux文件权限: 444 -r--r--r-- 600 -rw------- 644 -rw-r--r-- ...
- [转载]CentOS 6.5 安装五笔输入法
FROM:http://blog.sina.com.cn/s/blog_49d6d41c0101i0zs.html 1.一般安装了中文环境会默认安装了好多输入法,先删除了ibus sudo yum ...
- 2017.5.1 使用fat jar插件来打包有引用外部jar包的项目
如果在程序开发时用到了第三方提供的API.jar包或者其他附属资源.在导出并生成项目的jar文件时,必须将第三方的文件一并导出,否则无法正确运行. 可以使用fat jar插件,下载地址:http:// ...
- 用反射来了解Java中泛型的本质
这篇文章主要通过Class的Method来了解泛型的本质. 先new 两个List,一个不加类型限制,另外一个限制类型为String: ArrayList list = new ArrayList() ...
- 配置 FIS 来适配 go revel 框架以优化前端缓存策略
对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...
- 静态代码检查工具-PMD刚開始学习的人入门篇
前言: PMD是一款静态代码分析工具.它能够自己主动检測各种潜在缺陷以及不安全或未优化的代码. PMD很多其它地是集中在预先检測缺陷上.它提供了高度可配置的丰富规则集,用户能够方便配置对待特定项目使用 ...
- 4. 使用别的json解析框架【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boo ...
- Linux Java开发环境
一.旧版本JDK卸载 1.卸载系统自带JDK版本 #rpm -qa|grep gcj 查看到如下信息,如图所示: 进行卸载默认安装JDK: #rpm -e --nodeps java-1.4.2- ...
- Django内建模版标签和过滤器
第四章列出了许多的常用内建模板标签和过滤器.然而,Django自带了更多的内建模板标签及过滤器.这章附录列出了截止到编写本书时,Django所包含的各个内建模板标签和过滤器,但是,新的标签是会被定期地 ...