【BZOJ4514】数字配对(费用流)
题意:
有 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】数字配对(费用流)的更多相关文章
- [bzoj4514]数字配对[费用流]
今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...
- [SDOI2016][bzoj4514] 数字配对 [费用流]
题面 传送门 思路 一个数字能且只能匹配一次 这引导我们思考:一次代表什么?代表用到一定上限(b数组)就不能再用,同时每用一次会产生价值(c数组) 上限?价值?网络流! 把一次匹配设为一点流量,那产生 ...
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...
- BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]
4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...
- BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)
BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...
- 【BZOJ 4514】[Sdoi2016]数字配对 费用流
利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...
- 4514: [Sdoi2016]数字配对 费用流
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...
- bzoj4514 数字配对
思路 首先想到费用流. 对于每个点拆点.然后考虑我们怎样才能保证每个点只被用一次. 如果\(i\)与\(j\)满足条件.那么就从\(i\)向\(j\)连一条边并且从\(j\)向\(i\)连一条边.这样 ...
随机推荐
- maptalks 如何加载 ArcGIS 瓦片图层
最近需要加载 ArcGIS 瓦片图层,运行官网加载 ArcGIS 瓦片图层的 demo 是没有问题的.如果把 ArcGIS 瓦片图层 URL 换成是自已发布的 ArcGIS 地图服务,发现加载不出来, ...
- jenkins手把手教你从入门到放弃02-jenkins在Windows系统安装与配置(详解)
简介 上一篇对jenkins有了大致了解之后,那么我们就开始来安装一下jenkins. Jenkins安装 一.安装Java环境 1.你需要做的第一件事情就是在你的机器上安装Java环境.Jenkin ...
- winMTR的使用
WinMTR下载链接:http://pan.baidu.com/share/link?shareid=236531&uk=1126982975 WinMTR 使用方法及软件介绍: WinMTR ...
- 数据传递-------@PathVariable
package com.wh.handler; /** * 通过@PathVariable可以绑定占位符参数到方法参数中,例如 * @PathVariable("userId") ...
- [转]ASP .NET MVC 之Entity Framework- code first
本文转自:http://www.cnblogs.com/tomin/archive/2012/02/29/MVC_EntityFramework.html 最近,用到了ASP.NET MVC Ent ...
- [转]微信开发.Net 接入示例
本文转自:http://my.oschina.net/lcak/blog/219618 微信公众平台接口开发官方仅提供了 PHP 接入示例代码, 网上找到的.Net代码多半需要积分下载, 所以自己写了 ...
- hihocoder offer收割编程练习赛13 D 骑士游历
思路: 矩阵快速幂. 实现: #include <iostream> #include <cstdio> #include <vector> using names ...
- html与html5 总结
时间:于2017年12月3日 19:35:18开始 用于: 这文章用于个人技术总结(全文转发请标明出处,小段摘抄随意) HTML笔记1.html标签不区分大小写,但是建议小写2.常用标签: 可用在he ...
- Python学习日记之文件读取操作
Python内置了文件读写的函数open,read 用法示例: open('/home/root/files.txt ') 在打开文件后,操作完成后可以使用close()关闭文件,但比较好的文件读写方 ...
- java设计模式之代理模式模式总结
定义:代理模式这种设计模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 解读定义: 1.代理对象和目标对象有共同的接口: 2.使用代理对象执行目标对象中的方法: ...