【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]数字配对 图论-费用流的更多相关文章
- bzoj4514: [Sdoi2016]数字配对(费用流)
传送门 ps:费用流增广的时候费用和流量打反了……调了一个多小时 每个数只能参与一次配对,那么这就是一个匹配嘛 我们先把每个数分解质因数,记质因子总个数为$cnt_i$,那如果$a_i/a_j$是质数 ...
- BZOJ4514 [Sdoi2016]数字配对 【费用流】
题目 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×c ...
- BZOJ4514[Sdoi2016]数字配对——最大费用最大流
题目描述 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci ...
- 【BZOJ4514】数字配对(费用流)
题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...
- [SDOI2016]数字配对(费用流+贪心+trick)
重点是如何找到可以配对的\(a[i]\)和\(a[j]\). 把\(a[i]\)分解质因数.设\(a[i]\)分解出的质因数的数量为\(cnt[i]\). 设\(a[i]\geq a[j]\) 那么\ ...
- 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 726 Solved: 309[Submit][Status ...
- bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...
- bzoj4514 [Sdoi2016]数字配对
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
- bzoj4514 [Sdoi2016]数字配对(网络流)
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
随机推荐
- 2014.8.25 CAD系统事件触发流程
各进近.离场.进场Arinc424数据录入界面在CADDataManager/UC/UCIAP(UCSID)下 UCAirport是一抽象用户控件类,在FormADHP初始化时实例化成airport控 ...
- 第一章 初识MySQL(待续)
···········
- 强大的HTML5开发工具推荐
HTML5被看做是Web开发者创建流行Web应用的利器,增加了对视频和Canvas 2D的支持.HTML5的诞生还让人们重新审视浏览器专用多媒体插件的未来,如Adobe的Flash和微软的Silver ...
- Perl 变量:标量变量、数组变量、哈希变量和变量上下文
一.Perl 变量变量是存储在内存中的数据,创建一个变量即会在内存上开辟一个空间.解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型.浮点型.字符串等.上一章 ...
- 模仿慕课网一步步发布一个开源库到 JCenter
H:\common\-common-25.2.2\upload.gradle // Bintray /* Properties properties = new Properties() proper ...
- struts2 框架的基本使用
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- 面试题:SpringMVC的工作流程
SpringMVC是当今最主流的Web MVC框架,没有之一,要做一名合格的JavaWeb工程师,学好它势在必行! 与Struts2原理不同,SpringMVC是通过最基础最传统的servlet来实现 ...
- Docker学习之路(一)
容器简介 管理程序虚拟化(hypervisor virtualization, HV)是通过中间虚拟运行于物理硬件之上.而容器是直接运行在操作系统内核之上用户空间.因此,容器虚拟化运行也成为“操作系统 ...
- Luogu 2597 [ZJOI2012]灾难
BZOJ 2815. 解法还是挺巧妙的. 放上写得很详细很好懂的题解链接 戳这里. 一个物种$x$如果要灭绝,那么沿着它的入边反向走走走,一定可以走到一个点$y$,如果这个点$y$的物种灭绝了,那么 ...
- Vue.js 安装及其环境搭建
For me or other first studying vue.js. For Windows PC: 1.先安装node.js 安装官网最新的即可 版本应该要大于6.0版本 nodejs的官网 ...