\(\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. react中虚拟DOM

    简单来说虚拟DOM就是一个js对象,相对于真实dom来做比较更节约性能,虚拟DOM执行过程如下

  2. vue中动画的使用

    不要在router-view的外层使用动画!不要在router-view的外层使用动画!不要在router-view的外层使用动画! 重要的事情说三遍,在app.vue中自以为奇思妙想(实际是脑残)在 ...

  3. HTML5元素

    1.1结构元素 HTML5定义了一组新的语义化标签,目前主流浏览器均已支持,语义化标签使用标记元素的内容,虽然可以使用原有标签替换,但是它可以简化HTML页面设计,并且也为搜索引擎在抓取和索引网页的时 ...

  4. 第51篇-SharedRuntime::generate_native_wrapper()生成编译入口

    当某个native方法被调用时,一开始它会从解释入口进入,也就是我之前介绍的.由InterpreterGenerator::generate_native_entry()函数生成的入口例程.在这个例程 ...

  5. kibana7.x安装配置操作elasticsearch

    什么是Kibana? Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等. 而且还 ...

  6. Javascript实现全选按钮

    Javascript实现全选按钮 效果:有全选选项框和单个选项框,选择全选框,所有的的选择都打上的钩,取消全选钩所有的都去掉了钩,如果取消其中某一个的钩,那么全选的钩也取消,反之全选所有的选项,那么全 ...

  7. golang gin框架中实现"Transfer-Encoding: chunked"方式的分块发送数据到浏览器端

    参考了这篇帖子: https://golangtc.com/t/570b403eb09ecc66b90002d9 golang web如何发送小包的chunked数据 以下是代码: r.GET(&qu ...

  8. android ndk下没有pthread_yield,好在std::this_thread::yield()可以达到同样的效果

    一个多线程的算法中,发现线程利用率只有47%左右,大量的处理时间因为usleep(500)而导致线程睡眠: 性能始终上不去. 把usleep(500)修改为std::this_thread::yiel ...

  9. golang中GPM模型原理与调度器设计策略

    一.GMP模型原理first: 1. 全局队列:存放待运行的G2. P的本地队列:同全局队列类似,存放待运行的G,存储的数量有限:256个,当创建新的G'时,G'优先加入到P的本地队列,如果队列已满, ...

  10. golang中算数运算、位运算、逻辑运算、赋值运算常用方法

    package main import "fmt" var a = 21.0 var b = 5.0 //var c float64 func main() { Arithmeti ...