链接

https://www.lydsy.com/JudgeOnline/problem.php?id=4514

思路

EK直接贪心做

<0的时候加上剩余返回

二分图a->b的时候

把b->a也连接上

最后除2

整除和贪心可只知道它是对的

代码

#include <bits/stdc++.h>
#define ll long long
#define iter vector<int>::iterator
using namespace std;
const ll N=5e5+7;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
ll n,S,T,a[2007],b[2007],c[2007];
struct node {
ll u,v,nxt,cap,cost;
}e[N<<1];
ll head[N<<1],tot=1;
void add_edge(ll u,ll v,ll cap,ll cost) {
e[++tot].v=v;
e[tot].u=u;
e[tot].cap=cap;
e[tot].cost=cost;
e[tot].nxt=head[u];
head[u]=tot;
}
void Add(ll u,ll v,ll cap,ll cost) {
// cout<<u<<" "<<v<<"\n";
add_edge(u,v,cap,cost);
add_edge(v,u,0,-cost);
}
ll dis[N];
ll vis[N],frm[N];
bool spfa() {
memset(dis,-0x3f,sizeof(dis));
memset(vis,0,sizeof(dis));
queue<int> q;
q.push(S);
dis[S]=0;
while(!q.empty()) {
ll u=q.front();
q.pop();
vis[u]=0;
for(ll i=head[u];i;i=e[i].nxt) {
ll v=e[i].v;
if(e[i].cap&&dis[v]<dis[u]+e[i].cost) {
dis[v]=dis[u]+e[i].cost;
frm[v]=i;
if(!vis[v]) {
vis[v]=1;
q.push(v);
}
}
}
}
return dis[T]>=-0x3f3f3f3f3f3f3f;
}
ll EK() {
ll flow=0,ans=0;
while(spfa()) {
ll now_flow=0x3f3f3f3f;
for(ll i=frm[T];i;i=frm[e[i].u])
now_flow=min(now_flow,(ll)e[i].cap);
for(ll i=frm[T];i;i=frm[e[i].u]) {
e[i].cap-=now_flow;
e[i^1].cap+=now_flow;
}
if(ans+1LL*now_flow*dis[T]<0) {
ll ok=ans/-dis[T];
return flow+ok;
} else
ans+=now_flow*dis[T],flow+=now_flow;
}
return flow;
}
set<int> dsr[250];
int main() {
freopen("a.in","r",stdin);
n=read();
for(ll i=1;i<=n;++i) a[i]=read();
for(ll i=1;i<=n;++i) b[i]=read();
for(ll i=1;i<=n;++i) c[i]=read();
S=1001,T=1002;
for(ll i=1;i<=n;++i) {
ll tmp=a[i];
for(ll j=2;j*j<=tmp;++j) {
if(tmp%j==0) dsr[i].insert(j);
while(tmp%j==0) tmp/=j;
}
if(tmp!=1) dsr[i].insert(tmp);
}
for(ll i=1;i<=n;++i) Add(S,i,b[i],0);
for(ll i=1;i<=n;++i) Add(i+n,T,b[i],0);
for(ll i=1;i<=n;++i) {
for(ll j=i+1;j<=n;++j) {
ll x=i,y=j;
if(a[x]<a[y]) swap(x,y);
if(a[y]==0) continue;
if(a[x]%a[y]==0) {
if(dsr[x].count(a[x]/a[y])) {
Add(x,y+n,0x3f3f3f3f3f3fLL,c[x]*c[y]);
Add(y,x+n,0x3f3f3f3f3f3fLL,c[x]*c[y]);
}
}
}
}
printf("%lld\n",EK()/2LL);
return 0;
}

4514: [Sdoi2016]数字配对 费用流的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 4514: [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1606  Solved: 608[Submit][Statu ...

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

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

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

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

随机推荐

  1. Unity shader学习之逐顶点漫反射光照模型

    公式如下: Cdiffuse = Clight * mdiffuse * max(0, dot(n,l)); 其中,n 为表面法线,l 为指向光源的单位向量,mdiffuse 为材质温反射颜色,Cdi ...

  2. Java操作队列

    Java操作队列 常见的几种模式:   1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...

  3. 清华操作系统实验--80x86汇编基础

    前言 80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 ...

  4. leetCoder-wordBreak判断能否分词

    题目 Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determ ...

  5. 08 集合[11,22,33,44,55,66,77,88,99],将所有<66的值保存至字典的第一个key中,将所有>=66的值保存至字典的第二个key中。即:{'k1':<66的所有值,'k2':>=66的所有值}

    li = [11,22,33,44,55,66,77,88,99]dict = {'k1':[],'k2':[]}for i in li:    if i < 66:        dict[& ...

  6. html5随机背景颜色

    <script>var colors=['red','blue','green','orange','yellow'];    function bcolor(){        var ...

  7. 【Linux学习八】脚本编程

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.多层bash#.和source都是当前bash [root@nod ...

  8. 在Eclipse下配置算法(第四版)运行环境

    第一步:配置Eclipse运行环境 Eclipse运行环境配置过程是很简单的,用过Eclipse进行java开发或学习的同学应该都很熟悉这个过程了. 配置过程: (1)系统环境:Windows7 64 ...

  9. 利用webpack手动构建vue工程

    一 创建一个文件夹,在文件夹中打开命令行执行:$npm install 创建一个package文件 ,可以先忽略作者等信息: 二 安装webpack依赖包(根据需要安装)     //全局安装     ...

  10. ubuntu_python_environment

    参考:http://blog.csdn.net/kingppy/article/details/13080919 参考:http://blog.csdn.net/zhaobig/article/det ...