题意:

有 n 种数字,第 i 种数字是 ai、有 bi 个,权值是 ci。

若两个数字 ai、aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数,

那么这两个数字可以配对,并获得 ci×cj 的价值。

一个数字只能参与一次配对,可以不参与配对。

在获得的价值总和不小于 0 的前提下,求最多进行多少次配对。

n≤200,ai≤10^9,bi≤10^5,∣ci∣≤10^5

思路:裸的费用流,LYY一年前就已AC

加边的时候INT64没用,WA了好久……

费用流中每次找出的最长(短)路显然是依次不增(减)的,所以当找到一次不足以增广所有边时计算最多能增加的流量,且终止

 const oo=<<;
var head,vet,next,q,a,b,c,flag,prime,fan,f:array[..]of longint;
pre:array[..,..]of longint;
inq:array[..]of boolean;
dis,len1,len2:array[..]of int64;
n,m,i,tot,j,x,source,src,s,t:longint;
ans,flow,flow1:int64;
p:boolean; function min(x,y:int64):int64;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:int64):int64;
begin
if x>y then exit(x);
exit(y);
end; procedure add(a,b:longint;c,d:int64);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len1[tot]:=c;
len2[tot]:=d;
head[a]:=tot; inc(tot);
next[tot]:=head[b];
vet[tot]:=a;
len1[tot]:=;
len2[tot]:=-d;
head[b]:=tot;
end; function spfa:boolean;
var u,e,v,i,t,w,t1,w1:longint;
begin
for i:= to s do
begin
dis[i]:=-oo;
inq[i]:=false;
end;
t:=; t1:=; w:=; w1:=; dis[source]:=; q[]:=source; inq[source]:=true;
while t<w do
begin
inc(t); inc(t1);
if t1= then t1:=;
u:=q[t1]; inq[u]:=false;
e:=head[u];
while e<> do
begin
v:=vet[e];
if (len1[e]>)and(dis[u]+len2[e]>dis[v]) then
begin
pre[v,]:=u; pre[v,]:=e;
dis[v]:=dis[u]+len2[e];
if not inq[v] then
begin
inc(w); inc(w1);
if w1= then w1:=;
q[w1]:=v; inq[v]:=true;
end;
end;
e:=next[e];
end;
end;
if dis[src]=-oo then exit(false);
exit(true);
end; procedure mcf;
var k,e:longint;
t,s,now,i:int64;
begin
t:=oo; k:=src; s:=;
while k<>source do
begin
e:=pre[k,];
t:=min(t,len1[e]);
s:=s+len2[e];
k:=pre[k,];
end; if ans+t*s< then
begin
p:=false;
t:=ans div (-s);
end;
k:=src;
while k<>source do
begin
e:=pre[k,];
len1[e]:=len1[e]-t;
len1[fan[e]]:=len1[fan[e]]+t;
k:=pre[k,];
end;
ans:=ans+t*s;
flow:=flow+t; end; begin
assign(input,'bzoj4514.in'); reset(input);
assign(output,'bzoj4514.out'); rewrite(output);
readln(n);
for i:= to do
if i and = then fan[i]:=i+
else fan[i]:=i-;
for i:= to n do read(a[i]);
for i:= to n do read(b[i]);
for i:= to n do read(c[i]);
for i:= to do
begin
if flag[i]= then
begin
inc(m); prime[m]:=i;
end;
j:=;
while (j<=m)and(prime[j]*i<=) do
begin
t:=prime[j]*i; flag[t]:=;
if i mod prime[j]= then break;
inc(j);
end;
end;
for i:= to n do
begin
x:=a[i]; f[i]:=;
j:=;
while (x>)and(j<=m) do
begin
while x mod prime[j]= do
begin
inc(f[i]);
x:=x div prime[j];
end;
inc(j);
end;
if x> then f[i]:=;
end;
source:=n+; src:=n+; s:=n+;
for i:= to n do
if f[i] and = then add(source,i,b[i],)
else add(i,src,b[i],);
for i:= to n do
for j:= to n do
if (f[i]=f[j]+)and(a[i] mod a[j]=) then
begin
if f[i] and = then add(i,j,maxlongint,int64(c[i])*c[j])
else add(j,i,maxlongint,int64(c[i])*c[j]);
end;
ans:=; flow:=; p:=true;
while spfa and p do mcf;
writeln(flow);
close(input);
close(output);
end.

【BZOJ4514】数字配对(费用流)的更多相关文章

  1. [bzoj4514]数字配对[费用流]

    今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...

  2. [SDOI2016][bzoj4514] 数字配对 [费用流]

    题面 传送门 思路 一个数字能且只能匹配一次 这引导我们思考:一次代表什么?代表用到一定上限(b数组)就不能再用,同时每用一次会产生价值(c数组) 上限?价值?网络流! 把一次匹配设为一点流量,那产生 ...

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

    [BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...

  4. 【BZOJ4514】【SDOI2016】数字配对 [费用流]

    数字配对 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...

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

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

  6. BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]

    4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...

  7. BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)

    BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...

  8. 【BZOJ 4514】[Sdoi2016]数字配对 费用流

    利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...

  9. 4514: [Sdoi2016]数字配对 费用流

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...

  10. bzoj4514 数字配对

    思路 首先想到费用流. 对于每个点拆点.然后考虑我们怎样才能保证每个点只被用一次. 如果\(i\)与\(j\)满足条件.那么就从\(i\)向\(j\)连一条边并且从\(j\)向\(i\)连一条边.这样 ...

随机推荐

  1. object-c中实现特定一个或者多个页面横竖屏,其他界面保持竖屏显示。

    1.首先设置项目支持的屏幕方向.info.plist设置(自行设置) 2.写一个子类CusNavigationController 继承 UINavigationController,在CusNavi ...

  2. Java多线程(六)守护进程

    守护进程:当进程中不存在非守护线程了,则守护线程自动销毁: public class DaemonThread extends Thread{ private int i =0; public voi ...

  3. PWBI--Excel 数据源

    博客园地址: http://blog.sina.com.cn/s/blog_68c4467d0102w5cc.html http://www.cnblogs.com/asxinyu/p/Power_B ...

  4. 【js】callback时代的变更

    最近团队开始越来越多的使用es7标准的async/await,从最开始的promise到后面的generator,再到现在async,对于异步,每个时期都有着其特有的解决方案,今天笔者就以自己的接触为 ...

  5. 为 C# 代码生成 API 文档(自译)

    原文地址:http://broadcast.oreilly.com/2010/09/build-html-documentation-for-y.html#comments Sandcastle 功能 ...

  6. C#基础 集合

    //数组定义的时候 //需要定义数据类型 //需要定义初始长度 //int [] array = new int[5]; //int a = array.Length; //集合 //ArrayLis ...

  7. 《从Paxos到ZooKeeper 分布式一致性原理与实践》阅读【Leader选举】

    从3.4.0版本开始,zookeeper废弃了0.1.2这3种Leader选举算法,只保留了TCP版本的FastLeaderElection选举算法. 当ZooKeeper集群中的一台服务器出现以下两 ...

  8. 重新学习Java——Java基本的程序设计结构(一)

    最近在实验室看到各位学长忙于找工作的面试与笔试,深感自己的不足,决定重新好好学习一下<Java核心技术>这本书,曾经靠这本书走入Java的世界,但是也有很多的地方被我疏漏过去了,因此也是作 ...

  9. express模块安装使用命令配置

    之前的博客nodejs安装和配置好路径之后就可以安装express了: 随便打开个文件夹右键选择,git bash here 命令行里输入[npm install express -g] -g是全局安 ...

  10. Jmeter接口测试---webservices

    Jmeter与LR相比来说,测试webservices接口要简单很多. 下面说下具体的操作流程: 1.创建一个线程组 2.创建一个soap/xml请求 3.填写要进行测试webservice的请求内容 ...