\(\mathcal{Descriprtion}\)

  Link.

  在一个含 \(n\) 个结点的有向图中,存在边 \(\lang i,i+1,0\rang\),它们不能被删除;还有边 \(\lang i,j,-1\rang~(i<j)\) 和 \(\lang i,j,1\rang~(i>j)\),删除一条边的代价为 \(a_{i,j}\)。求使得图无负环的最小删边代价和。

  \(n\le500\)。

\(\mathcal{Solution}\)

  直接将原图看做一个差分约束模型,或说把 无负环 转化成 存在从 \(1\) 到 \(n\) 的最短路。设 \(x_i\) 表示 \(1\) 到 \(i\) 的最短路,那么首先必然有 \(x_i\ge x_{i+1}\),令 \(d_i=x_{i+1}-x_i\ge0\),考虑一条可删除的 \(\lang i,j\rang\) 被 \(\{d_{n-1}\}\) 影响的情况:

  • \(\lang i,j,-1\rang\):\(x_i\ge x_j+1\),说明当 \(\sum_{k=i}^{j-1}d_k=0\) 时,此边需要删去;
  • \(\lang i,j,1\rang\):\(x_i\ge x_j-1\),说明当 \(\sum_{k=j}^{i-1}d_k\ge2\) 时,此边需要删去。

此外已证,\(d_k\in\{0,1\}\) 必然能取到最优方案。所以令 \(f(i,j)\) 表示最近一个是 \(d_i=1\),前一个是 \(d_j=1\) 时,使结点 \(1\sim i+1\) 之间的边符合要求的最小删除代价和,预处理 \(+1\) 和 \(-1\) 边删除代价的二维前缀和,枚举前驱状态 \(f(j,k)\),可做到 \(\mathcal O(n^3)\) 转移。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>
#include <cstring> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) typedef long long LL; template<typename Tp>
inline Tp imax( const Tp a, const Tp b ) { return a < b ? b : a; }
template<typename Tp>
inline void chkmin( Tp& a, const Tp b ) { b < a && ( a = b ); } const int MAXN = 500;
const LL LINF = 0x3f3f3f3f3f3f3f3f;
int n;
LL wp[MAXN + 5][MAXN + 5], wn[MAXN + 5][MAXN + 5];
LL f[MAXN + 5][MAXN + 5]; inline LL negS( int a, const int b, int p, const int q ) {
a = imax( a, 1 ), p = imax( p, 1 );
return a > p || b > q ? 0 :
wn[p][q] - wn[p][b - 1] - wn[a - 1][q] + wn[a - 1][b - 1];
}
inline LL posS( int a, const int b, int p, const int q ) {
a = imax( a, 1 ), p = imax( p, 1 );
return a > p || b > q ? 0 :
wp[p][q] - wp[p][b - 1] - wp[a - 1][q] + wp[a - 1][b - 1];
} int main() {
scanf( "%d", &n );
rep ( i, 1, n ) rep ( j, 1, n ) {
if ( i < j ) scanf( "%lld", &wn[i][j] );
else if ( i > j ) scanf( "%lld", &wp[i][j] );
wn[i][j] += wn[i - 1][j] + wn[i][j - 1] - wn[i - 1][j - 1];
wp[i][j] += wp[i - 1][j] + wp[i][j - 1] - wp[i - 1][j - 1];
} LL ans = negS( 1, 1, n, n );
memset( f, 0x3f, sizeof f ), f[0][0] = 0;
rep ( i, 1, n - 1 ) rep ( j, 0, i - 1 ) {
rep ( k, 0, imax( j - 1, 0 ) ) {
chkmin( f[i][j], f[j][k] + negS( j + 1, j + 1, i, i )
+ posS( j + 2, 1, i + 1, k )
+ posS( i + 1, k + 1, i + 1, j ) );
}
chkmin( ans, f[i][j] + negS( i + 1, i + 1, n, n )
+ posS( i + 2, 1, n, j ) );
} printf( "%lld\n", ans );
return 0;
}

Solution -「AGC 036D」「AT 5147」Negative Cycle的更多相关文章

  1. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  4. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  5. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  6. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  7. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. RabbitMQ --- 直连交换机 【 有回调方法,获取消费结果 】

    1.前言 上一随笔详细记录了直连交换机的方法,发送的消息是异步的,如果消息未被消费者消费,那么可以一直存在消息队列中. 那么有没有办法做一个回调,当消息被消费后,被通知消息成功被消费者消费啦? 答案是 ...

  2. POJ 2387 Til the Cows Come Home (最短路径 模版题 三种解法)

    原题链接:Til the Cows Come Home 题目大意:有  个点,给出从  点到  点的距离并且  和  是互相可以抵达的,问从  到  的最短距离. 题目分析:这是一道典型的最短路径模版 ...

  3. python 读取配置文件ini ---ConfigParser

    Python读取ini文件需要用到 ConfigParser 模块 关于ConfigParser模块的介绍详情请参照官网解释:https://docs.python.org/2.7/library/c ...

  4. Java 中如何实现线程间通信

    世界以痛吻我,要我报之以歌 -- 泰戈尔<飞鸟集> 虽然通常每个子线程只需要完成自己的任务,但是有时我们希望多个线程一起工作来完成一个任务,这就涉及到线程间通信. 关于线程间通信本文涉及到 ...

  5. IDEA maven 项目修改代码不生效,mvn clean、install 后才生效

    Maven项目进行修改代码后我们重新运行代码,查看我们target目录下的class文件是否发生了变化.    如何查看class文件,鼠标移到项目,点击右键,然后点击 show in Explore ...

  6. 《剑指offer》面试题56 - I. 数组中数字出现的次数

    问题描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 1: 输入:nums = [4,1 ...

  7. python环境搭建以及jupyter notebook的安装和启动

    一.Python 环境搭建 本章节我们将向大家介绍如何在本地搭建Python开发环境. Python可应用于多平台包括 Linux 和 Mac OS X. 你可以通过终端窗口输入 "pyth ...

  8. 【reverse】逆向7 堆栈图

    [reverse]逆向7 堆栈图 前言 本章就是开始画堆栈图来打基础拉,堆栈熟悉了之后就可以开始C语言的逆向了. 这一章使用的exe文件,我已经上传到了我的个人网盘中,点击下载 1.准备工作 先看这张 ...

  9. C#winform控件序列化,反序列化

    using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System. ...

  10. unity3d发布安卓出错plese set the package name

    发布时报错 参考https://forum.unity.com/threads/where-is-package-name-setting.318839/ 参考https://answers.unit ...