[HZNOI #koishi] Magic

[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++;
}

o_47079034_p0.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同步与异步

同步&#xff1a; 做完一件事&#xff0c;再做另一件 煮好水&#xff0c;再拆泡面包装 异步&#xff1a; 可以同时做好几个任务 烧水&#xff0c;打开火之后&#xff0c;先去拆泡面包装&#xff0c;等水开了&#xff0c;再停下拆包装&#xff0c;去关掉火。。。。。 转载于:htt…

js(Dom+Bom)第一天(2)

webAPI 00-复习 内置对象中的方法 01-JavaScript组成 知识点-ECMASCRIPT 重点回顾 存储容器 变量数组对象 逻辑语法 分支语句循环语句switch语句 知识点-BOM 概念 Browser Object Model (浏览器器对象模型) 操作浏览器将浏览器看做是一个对象.作用 通过js操作浏览器中相…

mysql 主主复制的配置流程

1、先关闭B&#xff0c;把A的数据导出来&#xff0c;mysqldump -hlocalhost -uroot -p123456 --database ibprpu >ibprpu.sql2、关闭A&#xff0c;启动B&#xff0c;进入mysql建立一个新的数据库 create database ibprpu3、导入数据库 mysql -hlocalhost -uroot -p123456 &l…

华为架构师8年经验谈:从单体架构到微服务的服务化演进之路

本次分享的技术大纲如下&#xff1a; 传统应用开发面临的挑战服务化实践服务化不是银弹服务化架构的演进方向一 、传统应用开发面临的挑战 挑战1-- 研发成本高 主要体现在如下几个方面&#xff1a; 代码重复率高在实际项目分工时&#xff0c;开发都是各自负责几个功能&#xff…

轮播图制作(1)

轮播图制作 <body><div><img src"img/1.jpg" class"imgs" alt""><a href"#" class"left"><</a> //此处的箭头也可以用图标做出来<a href"#" class"right">>…

StringUtils工具类的常用方法

StringUtils 方法的操作对象是 java.lang.String 类型的对象&#xff0c;是 JDK 提供的 String 类型操作方法的补充&#xff0c;并且是 null 安全的(即如果输入参数 String 为 null 则不会抛出 NullPointerException &#xff0c;而是做了相应处理&#xff0c;例如&#xff0c…

struts2+extjs文件上传完整实现(攻克了上传中的各种问题)

版权声明&#xff1a;本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/shanhuhau/article/details/28617999 首先须要引入上传控件 <script type"text/javascript" src"<%basePath%>/js/ext/examples/ux/fileuploadfield/FileUploa…

放大镜制作(1)

放大镜制作 <div class"box" id"box"><!--左侧的盒子--><div class"small"><!--图片--><img src"images/big.jpg" width"350" class"aaa" alt""/><!--黄色小盒子--&…

.NET Framework 2.0 组件和非托管代码与交互操作详解(转)

.NET Framework 将促进与 COM 组件、COM 服务、外部类型库和许多操作系统服务的交互操作。在托管和非托管对象模型之间&#xff0c;数据类型、方法签名和错误处理机制都存在差异。为了简化 .NET Framework 组件和非托管代码之间的互用并便于进行移植&#xff0c;公共语言运行时…

git 删除远程分支和本地分支

删除远程分支和本地分支 https://www.cnblogs.com/luosongchao/p/3408365.html 将远程git仓库里的指定分支拉取到本地&#xff08;本地不存在的分支&#xff09; https://www.cnblogs.com/hamsterPP/p/6810831.html 转载于:https://www.cnblogs.com/mafeng/p/10619419.html

从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11343141.html 源代码&#xff1a;https://github.com/lamondlu/Mystique 前情回顾 从零开始实现ASP.NET Core MVC的插…

立体导航翻转案例

<div class"box"><!-- 立方体 --><ul><li><img src"img1/1.jpg" alt""></li><li><img src"img1/2.jpg" alt""></li><li><img src"img1/3.jpg" a…

Uncontrolled memory mapping in camera driver (CVE-2013-2595)

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主同意不得转载。https://blog.csdn.net/hu3167343/article/details/34434235 /* 本文章由 莫灰灰 编写&#xff0c;转载请注明出处。 作者&#xff1a;莫灰灰 邮箱&#xff1a; minzhenfei163.com */ 1漏洞描写…

表格隔行变色

<body><table border"0" align"center" cellspacing"1" cellpadding"0"><caption>恭喜发财</caption><thead><tr><th>代码</th><th>名称</th><th>最新公布净值<…

启动Cognos时报0106错误

1. 问题描述 启动Cognos失败&#xff0c;报错代码为0106。 2. 问题分析 是jdk版本不兼容。 3. 解决方案 方案一&#xff1a;更换jdk1.6&#xff0c;可以使用免安装版&#xff0c;不需要卸载原有的jdk将java_home的路径替换成jdk1.6的路径。 方案二&#xff1a;使用Cognos自带jd…

项目管理的测试版发布

最近有时间将以前没有写完的项目管理程序进一步完善&#xff0c;加入了项目任务之间的关连。功能&#xff1a;1、任务的关连Start to finishStart to startFinish to startFinish to finish2、任务关连表环路检测3、采用MVC模式进行开发4、自动导出XML5、双击连接线可以设置、删…

剑指offer.机器人的运动范围

地上有一个 m 行和 n 列的方格&#xff0c;横纵坐标范围分别是 0∼m−1 和 0∼∼n−1。一个机器人从坐标0,0的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于 kk 的格子。请问…

Tab栏切换布局分析

<body><div class"tab"><div class"tab_list"><ul><li class"current">商品介绍</li><li>规格与包装</li><li>售后包装</li><li>商品评价(50000)</li><li>手机社…

CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

CLR是Common Language Runtime的缩写&#xff0c;是.NET程序集或可执行程序运行的一个虚拟环境。CLR用于管理托管代码&#xff0c;但是它本身是由非托管代码编写的&#xff0c;并不是一个包含了托管代码的程序集&#xff0c;所以不能使用IL DASM进行查看&#xff0c;但CLR以dll…

表单的全选取消全选

<div class"wrap"><table border"1" cellspacing"0" cellpadding"0"><caption>恭喜发财</caption><thead><tr><th><input type"checkbox" id"j_cbAll" checked&quo…