【bzoj4514】: [Sdoi2016]数字配对

好像正常的做法是建二分图?

我的是拆点然后

S->i cap=b[i] cost=0

i'->T cap=b[i] cost=0

然后能匹配的两点i,j 连 i->j' cap=inf cost=c[i]*c[j]

跑最大费用流,直到 cost<0 或 全部增广完

最后flow/2就是答案

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std; #define ll long long
const ll inf=1e18;
const int N=1e5+;
struct edge{
int from,next,to;
ll v,c;
}e[N];
int first[N],pr[N],prime[N],inq[N],lst[N];
ll A[N],B[N],C[N],dis[N],minf[N];
int S=,T=,ade=,P,n;
queue <int> Q; void addedge(int x,int y,ll v,ll c){
e[++ade].to=y;
e[ade].from=x;
e[ade].next=first[x];
e[ade].v=v;
e[ade].c=c;
first[x]=ade;
} void ADE(int x,int y,ll v,ll c){
addedge(x,y,v,c);
addedge(y,x,-v,);
} void Prime(){
for (int i=;i<;i++) prime[i]=;
for (int i=;i<;i++){
if (prime[i]){
pr[++pr[]]=i;
for (int j=i+i;j<;j+=i) prime[j]=;
}
}
} bool check(ll x){
if (x==) return ;
for (int i=;i<=pr[] && pr[i]<x ;i++) if (!(x%pr[i])) return ;
return ;
} #define s e[x].to
#define v e[x].v
#define cap e[x].c
#define Cap e[x^1].c
bool SPFA(ll &mf,ll &mc){
for (int i=;i<=n*+;i++) dis[i]=-inf,minf[i]=inf;
Q.push(S),inq[S]=,dis[S]=;
while (!Q.empty()){
int p=Q.front();
Q.pop(),inq[p]=;
for (int x=first[p];x;x=e[x].next){
if (dis[s]<dis[p]+v && cap>){
dis[s]=dis[p]+v;
lst[s]=x;
minf[s]=min(minf[p],cap);
if (!inq[s]) Q.push(s),inq[s]=;
}
}
}
if (dis[T]==-inf) return ;
for (int x=lst[T];x;x=lst[e[x].from]) {cap-=minf[T],Cap+=minf[T];}
mf+=minf[T];
mc+=dis[T]*minf[T];
if (mc<){
mf-=mc/dis[T]+(mc%dis[T]!=);
return ;
}
return ;
} void mcmf(){
ll mf=,mc=;
while (SPFA(mf,mc));
printf("%lld\n",mf/);
}
#undef s
#undef v
#undef c
#undef C int main(){
Prime();
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lld",&A[i]);
for (int i=;i<=n;i++) scanf("%lld",&B[i]);
for (int i=;i<=n;i++) scanf("%lld",&C[i]);
for (int i=;i<=n;i++){
ADE(S,i+,,B[i]);
ADE(i+n+,T,,B[i]);
for (int j=;j<=n;j++){
if (A[i]>A[j] && A[i]%A[j]==){
if (check(A[i]/A[j])){
ADE(i+,j+n+,C[i]*C[j],inf);
ADE(j+,i+n+,C[i]*C[j],inf);
}
}
}
}
mcmf();
return ;
}

【bzoj4514】: [Sdoi2016]数字配对 图论-费用流的更多相关文章

  1. bzoj4514: [Sdoi2016]数字配对(费用流)

    传送门 ps:费用流增广的时候费用和流量打反了……调了一个多小时 每个数只能参与一次配对,那么这就是一个匹配嘛 我们先把每个数分解质因数,记质因子总个数为$cnt_i$,那如果$a_i/a_j$是质数 ...

  2. BZOJ4514 [Sdoi2016]数字配对 【费用流】

    题目 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×c ...

  3. BZOJ4514[Sdoi2016]数字配对——最大费用最大流

    题目描述 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci ...

  4. 【BZOJ4514】数字配对(费用流)

    题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...

  5. [SDOI2016]数字配对(费用流+贪心+trick)

    重点是如何找到可以配对的\(a[i]\)和\(a[j]\). 把\(a[i]\)分解质因数.设\(a[i]\)分解出的质因数的数量为\(cnt[i]\). 设\(a[i]\geq a[j]\) 那么\ ...

  6. 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 726  Solved: 309[Submit][Status ...

  7. bzoj4514: [Sdoi2016]数字配对--费用流

    看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...

  8. bzoj4514 [Sdoi2016]数字配对

    Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...

  9. bzoj4514 [Sdoi2016]数字配对(网络流)

    Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...

随机推荐

  1. maven项目依赖包问题

    问题 maven传递依赖 解决方案   前段时间,开发中遇到一个关于maven依赖包的问题:由于业务需要,支付网关对账代码中的slf4j-api包需要更新,原包为1.5.8版本,需要更新到1.6.4版 ...

  2. Android 使用官方下拉刷新

    网上关于下拉刷新的文章也不少,不过都太长了,看得挺难受的.恰好发现了官方的下拉刷新库,而且效果还是不错的,简洁美观,用得也挺方便. 下面是效果图: 我的好友原来是空的,刷新后多了两个. 使用还是挺方便 ...

  3. 黑客工具包ShadowBrokers浅析

    臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers 在 steemit.com博客上提供了相关消息. 本次被公开的工具包大小为117.9MB,包含23 个黑客工具,其中部分文件显示 ...

  4. MYCAT实战之分片迁移

    实践扩容 1.要求: travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上, 并完成记录要求,最快的数据迁移做法,中断业务时间最短 2.针对分片以及迁 ...

  5. SQL和NoSQL

    SQL和NoSQL 目前的数据库系统非常多,有传统的关系型的数据库系统(又被称为SQL数据库系统),有最近几年流行起来的NoSQL数据库系统.其中NoSQL数据库系统又分为很多种不同的类型,根据各个系 ...

  6. 刷题向》关于第一篇状压DP BZOJ1087 (EASY+)

    这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合 ...

  7. HTTP状态详解

    1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请求失败 100——客户必须继续发出请求1 ...

  8. 通过递归遍历n位2进制数的所有情况

    题目要求: 输入一个正整数m,输出m位2进制的所有取值情况,从小到大输出,每个输出结果用换行符分割. 解题思路: 通过递归调用,从第1个到第m个数组元素分别置0和置1,然后当从1到m所有的元素都置0或 ...

  9. 流Stream

    System.IO 提供了一个抽象类Stream , Stream类 支持对字节的读写操作.所谓的“流”,指的是Stream,也就是所谓的一个文件区.这个文件区中存储着的信息可以是在内存中,也可以是在 ...

  10. Java方法学习疑问

    此方法不理解 finalize() 方法 Java允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做finalize( ),它用来清除回收对象. 例如,你可以使用finaliz ...