【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 ;
}

最新文章

  1. C# 关键字extern用法
  2. npm 安装本地包
  3. cordova3.X 运用grunt生成plugin自定义插件骨架
  4. Monkey学习(1)环境搭建
  5. 20150414---ListView简介(web)
  6. net中使用母版页
  7. [汇编语言]-debug跟踪执行
  8. label按钮和文字对齐
  9. 准备PPT过程中的一些文档记录
  10. tomcat多实例
  11. 4-linux、hdfs命令
  12. Microsoft解读
  13. What’s for Beta
  14. ORA-214 signalled during: ALTER DATABASE MOUNT 问题
  15. 解决Fiddler抓不到HTPPS
  16. 【Java】 子字符串的比较(substring的==与equal()使用)
  17. TCP系列54—拥塞控制—17、AQM及ECN
  18. Symantec Backup Exec(BE)的启停
  19. 【转】Linux 图形界面与命令行模式切换
  20. Perl6 Bailador框架(7):模版编写

热门文章

  1. 主流ETL工具
  2. java事件监听机制2
  3. Python 面向对象的进阶
  4. Java微信公众平台开发(五)--文本及图文消息回复的实现
  5. Apache Shiro 权限框架
  6. 优于jdbc的mybatis框架入门
  7. sonarLint 插件配置sonarQube Server
  8. Python的Flask框架使用Redis做数据缓存的配置方法
  9. Effective ObjectiveC 2.0 Note
  10. Mock Server实践