#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
int cnt=1;//边的数量
int head[110],cur[110];//head记录每一个点最后一条边的编号,cur记录当前点循环到了哪一条边
int n,deep[110],s,t,start;//s设为不选,t为选,即源点和汇点
//权值为负的点向s连容量为-w的边,权值为正的点向t连容量为w的边
//这里的容量相当于是割掉这条边的代价
ll ans,tmp;
queue<int>q;//定义一个bfs寻找分层图时的队列
struct node
{
    int to,next;//to即每一条边指向的点,next指向对应点的前一条边
    ll w;//每一条边的残量
}num[25000];
void add(int start,int y,ll w)//对于所有有倍数关系的点,小的向大的连inf的边
//ans一开始为所有正权边的权值和
{
    num[++cnt].to=y;
    num[cnt].next=head[start];
    num[cnt].w=w;
    head[start]=cnt;
    num[++cnt].to=start;
    num[cnt].next=head[y];
    num[cnt].w=0;
    head[y]=cnt;
}
int bfs()
{
    memset(deep,0,sizeof(deep));//初始化深度为0
    deep[s]=1;//源点深度为1
    q.push(s);
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        for(int i=head[now];i;i=num[i].next)
        {
            if(!deep[num[i].to]&&num[i].w)//当前还未分配深度且残量不为零,则分配深度并放入队列
            {
                deep[num[i].to]=deep[now]+1;//计算深度
                q.push(num[i].to);//入队一个节点
            }
        }
    }
    return deep[t];
}
ll dfs(int start,ll minf)//当前节点,当前流量
{
    ll tmp=minf;
    if(start==t)//到达汇点直接返回前面流过来的流量
        return minf;
    for(int &i=cur[start];i&&tmp;i=num[i].next)//当前弧优化,运用指针在修改i的同时,将cur[start]顺便修改
    {
        if(deep[start]+1==deep[num[i].to]&&num[i].w)//满足分层图的性质
        {
            ll t=dfs(num[i].to,min(num[i].w,tmp));//继续找增广路
            tmp-=t;//剩余容量
            num[i].w-=t;//正向边减
            num[i^1].w+=t;//反向边加
        }
    }
    return minf-tmp;//返回最小割
}
void dinic()
{
    while(bfs())
    {
        memcpy(cur,head,sizeof(head));//每一次建立完分层图后都要把cur置为每一个点的第一条边
        while(tmp=dfs(s,inf))
            ans-=tmp;//减去最小割
    }
}
int main()
{
    scanf("%d",&n);
    s=n+1;
    t=s+1;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&start);
        if(start>=0)
        {
            add(i,t,start);
            ans+=start;
        }
        else
            add(s,i,-start);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=2*i;j<=n;j+=i)
        {
            add(i,j,inf);
        }
    }
    dinic();
    printf("%lld\n",ans);
    return 0;
}
/*最小割建模
最大流模板
dinic当前弧优化算法(isap
建模方法:分为选和不选两部分点,
把边的容量设为代价,
通过正负的约束来使得要求的是最小割,
ans一开始统计全部保留和t点(保留点)连边的价值和*/

ARC085E(最小割规划【最大流】,Dinic当前弧优化)的更多相关文章

  1. [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]

    题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...

  2. 【Luogu】P2057善意的投票(最小割转最大流)

    题目链接 也算水题一道吧,不过Round1感性理解一下就xjb建了个图,40 Round2仔细分析了一会,理性建了个图,90 然后分析了半天……改大数组就A了…… 从S到所有值为1的点连一条inf的边 ...

  3. ACM/ICPC 之 伞兵-最小割转最大流(POJ3308)

    //以行列建点,伞兵位置为单向边-利用对数将乘积转加法 //最小割转最大流 //Time:63Ms Memory:792K #include<iostream> #include<c ...

  4. [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流

    题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...

  5. hdu3491最小割转最大流+拆点

    题意:求最小割,即求最大流即可.此题之关键为拆点(限制在点),每条边都是双向边,注意一下. 未1A原因:在拆点之后添加边的过程中,要注意,出去的是i`,进来的是i,!!所以,写addegde函数时候 ...

  6. nyoj 667 碟战 最小割(最大流)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=677 题意转化:将点0与所有的有间谍的点相连,则题意变为求点0到点n的最小割,直接套最大流 ...

  7. [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)

    题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...

  8. BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)

    BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...

  9. 【Luogu】P2598狼和羊的故事(最小割转最大流)

    题目链接 最小割水题.入点向白点连边,白点向白点.黑点和空点连边,空点向空点和黑点连边,黑点向黑点和汇点连边.然后跑最大流即可. 话说Fd最近怎么光做水题啊……一点用都没有……qwq 我太菜了,做完一 ...

随机推荐

  1. HTML5坦克大战

    在JavaScript中,不要在变量为定义之前去使用,这样很难察觉并且无法运行. 颜色不对. 当我的坦克移动时,敌人坦克消失. tankGame3.html <!DOCTYPE html> ...

  2. ES提高数据压缩的设置——单字段,去掉source和all

    curl -XPUT 'http://localhost:9200/hec_test3' -d ' { "mappings": { "hec_type3": { ...

  3. ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

    一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...

  4. FFmpeg 的sws_getContext函数 、sws_scale函数

    FFmpeg里面的sws_scale库可以在一个函数里面同时实现:1.图像色彩空间转换:2.分辨率缩放:3.前后图像滤波处理. 其核心函数主要有三个: // 初始化sws_scalestruct Sw ...

  5. 左右选择框 js插件

    随着项目的进展,测试工程师在更多的浏览器中兼容性测试中,发现有些浏览器不支持option的触发事件,这就造成了先前一篇博文bootstrap 左右框多项选择示例 中左右选择框的失效,于是我就由原先的s ...

  6. 每天一个linux命令(13):more命令

    版权声明更新:2017-05-17博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  7. bzoj 1242 弦图判定 MCS

    题目大意: 给定一张无向图,判断是不是弦图. 题解: 今天刚学了<弦图与区间图> 本来写了一个60行+的学习笔记 结果因为忘了保存重启电脑后被还原了... 那就算了吧. MCS最大势算法, ...

  8. NOIP2018爆炸记

    又是一年\(NOIP\),可能是梦结束的地方? 之所以咕了这么久是得先确定自己不会退役,因为分太低了. 和去年一样在学校门前照了相,然后上车走了.高三回来考的只剩下\(p2oileen\)学姐了.新一 ...

  9. java静态方法(变量)、非静态方法(变量)区别

    java静态方法.静态变量在调用时生成唯一标识,即在内存中给定一个静态位子,这样在调用时可以直接找到,而且会节省内存.但如果声明的静态方法.静态变量过多,会占用过多内存,有可能导致内存溢出. 非静态方 ...

  10. 洛谷【P1142】轰炸

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:https://www.luogu.org/problemnew/show/P ...