$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 ;
}
随机推荐
- Git 进阶:10大技巧让你迅速提升
1.Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情. 命令: cd ~ curl https://raw.github.com/git/git/ma ...
- Laravel 的HTTP控制器
简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...
- ExecutorService小试牛刀
现在的项目中有将学生批量加入课程的需求,于是想根据这个需求测试一下ExecutorService的效率.假设一个场景:现在有100门课,1500名学生,要求每15个人加入一门课程,不重复. 查询并拼接 ...
- @codeforces - 1205C@ Palindromic Paths
目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...
- C++ 结构体的定义
struct 结构体名称{ 数据类型 A: 数据类型 B; }结构体变量名; 相当于: struct 结构体名称{ 数据类型 A: 数据类型 B; }; struct 结构体名 ...
- CODE FESTIVAL 2017 qual B C 3 Steps(补题)
总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...
- 【C++竞赛 B】yyy的回文数组
时间限制:1s 内存限制:32MB 问题描述 回文串是一个正读和反读都一样的字符串,比如level或者noon就是回文串.回文数组也是如此,比如[100,200,100]或者[178,256,256, ...
- H3C 多区域OSPF配置示例
- 【js】vue 2.5.1 源码学习 (十一) 模板编译compileToFunctions渲染函数
大体思路(九) 本节内容: 1. compileToFunctions定位 1. compileToFunctions定位 ==> createCompiler = createCompiler ...
- H3C 路由度量值(Metric)