$loj\ 2031\ [SDOI2016]$数字配对 网络流
正解:网络流
解题报告:
显然先预处理哪些$a$之间可以连边,然后考虑建两排点,连流量为$c_{i}\cdot c_{j}$,然后$ST$连$inf$,跑个费用流?
然后现在碰到了两个问题$QwQ$
第一个说不能重复使用?
可以考虑这样儿,就如果$(i,j)$是一对可行点对,那就要连$(i,{j}'),(j,{i}')$,显然不可能只跑一条嘛,然后最后答案除以2就成$QwQ$
第二个说问在费用大于等于0的前提下的最大流,,,就很单纯不做作和之前的题都不太一样,,,
考虑贪心,首先说费用最大先取反呗.
然后就每次增广的时候判断下,如果之前增广的费用+当前增广费用>0就取之前算出来的最大流量就成$QwQ$
正确性在于每次跑的都最短路?所以就十分显然不说了$QwQ$
$over$
昂对了记得开$ll$,,,$100pts->50pts$还是有点难受的,,,$QAQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define int long long
#define t(i) edge[i].to
#define n(i) edge[i].nxt
#define w(i) edge[i].wei
#define fy(i) edge[i].fy
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,M=+,inf=1e9;
int head[N],ed_cnt=-,S,T,dis[N],fr_nod[N],fr_ed[N],cost,n,a[N],c[N],fl;
bool vis[N];
struct ed{int to,nxt,wei,fy;}edge[M<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z,ri p)
{
//printf("%d -> %d : %d , %d\n",y,x,z,p);
edge[++ed_cnt]=(ed){x,head[y],z,p};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],,-p};head[x]=ed_cnt;}
il bool spfa()
{
queue<int>Q;Q.push(S);memset(dis,,sizeof(dis));dis[S]=;vis[S]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();vis[nw]=;//printf("nw=%d\n",nw);
e(i,nw)
{
if(w(i) && fy(i)+dis[nw]<dis[t(i)])
{dis[t(i)]=dis[nw]+fy(i);fr_nod[t(i)]=nw;fr_ed[t(i)]=i;if(!vis[t(i)])Q.push(t(i)),vis[t(i)]=;}
}
}
if(dis[T]==dis[T+])return ;
ri flow=dis[T+];
for(ri i=T;i!=S;i=fr_nod[i])flow=min(flow,w(fr_ed[i]));
for(ri i=T;i!=S;i=fr_nod[i])w(fr_ed[i])-=flow,w(fr_ed[i]^)+=flow;
cost+=flow*dis[T];if(cost>){cost-=flow*dis[T];fl+=1ll*cost/(-dis[T]);return ;}fl+=flow;return ;
}
il bool check(ri x){for(ri i=;i*i<=x;++i)if(!(x%i))return ;return ;}
il void pre()
{
rp(i,,n)
{
rp(j,,n)
{
if(i==j)continue;if(a[i]%a[j])continue;if(a[i]==a[j] && i<j)continue;
if(check(a[i]/a[j]))ad(j+n,i,inf,-c[i]*c[j]),ad(i+n,j,inf,-c[i]*c[j]);
}
}
} main()
{
//freopen("4068.in","r",stdin);freopen("4068.out","w",stdout);
n=read();S=;T=n<<|;memset(head,-,sizeof(head));
rp(i,,n)a[i]=read();rp(i,,n){ri x=read();ad(i,S,x,);ad(T,i+n,x,);}rp(i,,n)c[i]=read();pre();
while(spfa());printf("%d\n",fl/);
return ;
}
随机推荐
- @atcoder - AGC034E@ Complete Compress
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点的树,编号为 1, 2, ..., N.第 i ...
- JavaScript原型链中toString()方法输出alert()和console.log()得到不同的结果
<script language="javascript"> function myObj(){ var total = 0; } myObj.prototype.ad ...
- java 根据秘钥,对数据进行加解密
package test; import com.alibaba.fastjson.JSONObject; import sun.misc.BASE64Decoder; import sun.misc ...
- 在线url网址编码、解码
>>在线url网址编码.解码<<
- ListView 适配器实现getviewtypecount() 数组越界IndexOutOfBoundException
ListView中Item的多布局显示,需要用到了getviewtypecount和getItemViewType这两个重写方法,但是做完后出现了如下提示错误: java.lang.ArrayInde ...
- saltStack_Pillar
Pillar是Salt非常重要的一个组件,它用于给特定的minion定义任何你需要的数据,这些数据可以被Salt的其他组件使用.这里可以看出Pillar的一个特点,Pillar数据是与特定minion ...
- 5 获取Form表单取值
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和 POST 方式def data( ...
- 在phpstudy中nginx伪静态配置
########################### #以下是虚拟主机配置 server { listen 80; server_name hzym.com; root "D:\phpst ...
- HTML静态网页--JavaScript-DOW操作
1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Windows对象操作 一.属性和方法: 属性(值或者子对象): o ...
- ThinkPHP商城实战
ThinkPHP3.2.3商城实战教程,需要的联系我,QQ:1844912514 千万级php电商秒杀项目实战 ,需要的联系我,QQ:1844912514