[HZNOI #514] Magic

题意

给定一个 \(n\) 个点 \(m\) 条边的有向图, 每个点有两个权值 \(a_i\) 和 \(b_i\), 可以以 \(b_i\) 的花费把第 \(i\) 个点的 \(a_i\) 变成 \(0\). 最后每个点 \(i\) 产生的花费为所有从 \(i\) 出发能通过一条有向边直接到达的点 \(j\) 的 \(a_j\) 的 \(\max\). 最小化这个过程中的总花费.

\(n\le 1000,m\le50000\)

题解

一点都不套路的最小割.

果然我是不会网络流的.

对于每个点, 如果将它的邻接点按照 \(a_j\) 降序排序的话, 不难发现必然要干掉一个前缀的所有 \(a_j\) 才能让这个点在最后统计的时候产生的花费变小. 但是多次干掉同一个点不能重复计算花费.

那么我们一点都不自然地想到最小割. 先把所有点拆成两个, 一个负责计算最终统计时的花费 (A类点), 一个负责计算被干掉的时候产生的花费 (B类点). 被干掉的时候产生的花费直接连一条流量为 \(b_i\) 的边到 \(t\) 就可以了. 最终统计时的花费先从 \(s\) 连一条 \(\infty\) 边到当前点, 然后按照 \(a_j\) 降序拉出一条链来, 链上的每个点代表一条边, 权值为这条边到达的点的 \(a_j\). 然后再从链上的每个点连一条 \(\infty\) 边到 \(j\) 对应的点. 这样的话如果 \(s\verb|-|t\) 被割断, 那么对于每一个 A 类点, 后面必然是割掉了某个 \(a_j\), 同时所有大于被割断的 \(a_j\) 的边邻接的点必然都已经被割掉了 \(b_i\).

建图Dinic就可以了.

这个拉链然后最小割的套路依然没有学会...果然我还是太菜了QAQ...

什么你问我 \(n+m\) 个点Dinic怎么跑过去的? 我怎么知道?Dinic的运行速度大概都是靠信仰吧...

恋恋世界第一!

参考代码

#include <bits/stdc++.h>const int MAXV=1e5+10;
const int MAXE=5e6+10;
const int INF=0x7FFFFFFF;struct Edge{int from;int to;int flow;Edge* rev;Edge* next;
};
Edge E[MAXE];
Edge* head[MAXV];
Edge* cur[MAXV];
Edge* top=E;int v;
int e;
int a[1010];
int b[1010];
int depth[MAXV];
std::vector<int> link[1010];bool BFS(int,int);
int Dinic(int,int);
int DFS(int,int,int);
void Insert(int,int,int);int main(){freopen("magic.in","r",stdin);freopen("magic.out","w",stdout);scanf("%d%d",&v,&e);for(int i=1;i<=v;i++)scanf("%d",a+i);for(int i=1;i<=v;i++)scanf("%d",b+i);for(int i=0;i<e;i++){int a,b;scanf("%d%d",&a,&b);link[a].push_back(b);}for(int i=1;i<=v;i++)std::sort(link[i].begin(),link[i].end(),[](int a,int b){return ::a[a]>::a[b];});int s=0,t=1,cnt=v*2+1;for(int i=1;i<=v;i++){Insert(s,i+1,INF);Insert(i+v+1,t,b[i]);int last=i+1;for(size_t j=0;j<link[i].size();j++){++cnt;Insert(cnt,v+link[i][j]+1,INF);Insert(last,cnt,a[link[i][j]]);last=cnt;}}printf("%d\n",Dinic(s,t));return 0;
}int Dinic(int s,int t){int ans=0;while(BFS(s,t))ans+=DFS(s,INF,t);return ans;
}bool BFS(int s,int t){memset(depth,0,sizeof(depth));std::queue<int> q;q.push(s);depth[s]=1;cur[s]=head[s];while(!q.empty()){s=q.front();q.pop();for(Edge* i=head[s];i!=NULL;i=i->next){if(i->flow>0&&depth[i->to]==0){depth[i->to]=depth[s]+1;cur[i->to]=head[i->to];if(i->to==t)return true;q.push(i->to);}}}return false;
}int DFS(int s,int flow,int t){if(s==t||flow<=0)return flow;int rest=flow;for(Edge*& i=cur[s];i!=NULL;i=i->next){if(i->flow>0&&depth[i->to]==depth[s]+1){int tmp=DFS(i->to,std::min(rest,i->flow),t);if(tmp<=0)depth[i->to]=0;rest-=tmp;i->flow-=tmp;i->rev->flow+=tmp;if(rest<=0)break;}}return flow-rest;
}inline void Insert(int from,int to,int flow){top->from=from;top->to=to;top->flow=flow;top->rev=top+1;top->next=head[from];head[from]=top++;top->from=to;top->to=from;top->flow=0;top->rev=top-1;top->next=head[to];head[to]=top++;
}

转载于:https://www.cnblogs.com/rvalue/p/10615423.html

[HZNOI #koishi] Magic相关推荐

  1. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  2. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 前置知识:小学生都能看懂的群论从入门到升天教程 <群论全家桶> 一道简单的题目 Probl ...

  3. 安装报错_RG Magic Bullet安装报错修复方法

    RG Magic Bullet安装报错修复方法 安装和谐版红巨星插件发现有很大的概率报错.这几天重装电脑被这个插件搞得头大.网上查了一些排除错误的方法,基本错误可以靠删除一些重复的文件夹和老版本来修复 ...

  4. magic系统将来能升鸿蒙,荣耀30和V30将首批搭载Magic UI 4.0 后续可升级鸿蒙系统

    腾讯科技讯 9月10日下午15点30分,华为消费者业务软件部总裁王成录在华为开发者大会上发表了题为<连接无限可能-全场景终端软件发布>的主题演讲,EMUI 11和Magic UI 4.0同 ...

  5. 全球首个Magic Leap One体验:吓到你不敢进房间

    来源:智东西 概要:业内备受关注的AR技术公司Magic Leap,在获得19亿美元融资历经七年之后,终于放出其第一款头盔产品Magic Leap One,很快在科技圈.VR圈引起刷屏式关注. 昨夜, ...

  6. 吊打Magic Leap,微软HoloLens 2不只为炫技

    近几日网上关于HoloLens 2的话题颇多.Infinite Retina联合创始人,拥有40多万关注者的Robert Scoble发推写道,HoloLens 2一出,Magic Leap就没那么& ...

  7. 新产品扑朔迷离,Magic Leap又跑去收购3D扫描公司

    Magic Leap收购Dacuda的3D扫描资产,很可能是为了解决其产品的位置追踪问题. 对于神秘的AR公司Magic Leap来说,他们的一举一动都会成为科技圈的头条,上周被外媒曝出产品原型机,不 ...

  8. 终于要揭开神秘面纱?Magic Leap将要展示产品

    Magic Leap准备下周召开董事会,并且会在会议上展示Magic Leap的原型机 "PEQ ". 自打去年年底被爆出产品无法小型化的问题之后,Magic Leap沉寂了一段时 ...

  9. Java Magic. Part 5: SecurityManager

    2019独角兽企业重金招聘Python工程师标准>>> Pouring a bit light on SecurityManager and its use cases. Intro ...

最新文章

  1. SAP HANA:持续创新十周年
  2. excel相乘再相加_excel将两组数据相乘后再求和该怎么操作?
  3. SpringMVC的表单标签库
  4. 30_visdom可视化、TensorboardX及其案例、安装visdom、使用visdom的案例
  5. 设置header_Nginx的这些安全设置,你都知道吗?
  6. 派单o2o全开源版 v11.6.0 全新UI版 修复短信问题 小程序模块
  7. Cassandra 简介
  8. 习题7.10 使用割线法求解方程
  9. 服务器压力测试怎么做_做手游怎么选服务器?
  10. linux下iptables的编译及简单使用
  11. 【实践】文本相关性和知识蒸馏在知识蒸馏中的应用实践
  12. nginx 的启动、停止与重启
  13. python close_wait_TCP time_wait close_wait问题(可能是全网最清楚的例子)
  14. CGAL中Polyhedron_3中与半边结构有关的具体使用
  15. 大数据hadoop入门 总结图
  16. 无人机如何通过GB28181协议接入视频会议
  17. CentOS(Linux)安装KETTLE教程 并配置执行定时任务
  18. c语言用if函数如何判断闰年,excel怎么用IF公式判断闰?
  19. C++大小写字母转换(齐全)
  20. [PyQt] MCV模式学习-0

热门文章

  1. 2013二级java真题_2013年计算机二级JAVA第八套模拟试题及答案详解
  2. java 线程模型_Java基础篇之Java线程模型
  3. php存密码,php 登录验证的代码(基于文件保存的密码)
  4. mysql安装教程8.0.22_mysql 8.0.22 安装配置方法图文教程
  5. Maven基础了解及配置信息
  6. 钉钉开发者接口文档_无需开发,IT事件接入钉钉的方法详解
  7. python初学篇笔记_Python学习笔记(基础篇)
  8. POJ 2054 Color a Tree解题报告
  9. C/C++头文件一览表
  10. wien2k 2009 编译方法