zoukankan      html  css  js  c++  java
  • Solution -「AGC 036D」「AT 5147」Negative Cycle

    (mathcal{Descriprtion})

      Link.

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

      (nle500)

    (mathcal{Solution})

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

    • (lang i,j,-1 ang)(x_ige x_j+1),说明当 (sum_{k=i}^{j-1}d_k=0) 时,此边需要删去;
    • (lang i,j,1 ang)(x_ige x_j-1),说明当 (sum_{k=j}^{i-1}d_kge2) 时,此边需要删去。

    此外已证,(d_kin{0,1}) 必然能取到最优方案。所以令 (f(i,j)) 表示最近一个是 (d_i=1),前一个是 (d_j=1) 时,使结点 (1sim 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
    ", ans );
        return 0;
    }
    
    
  • 相关阅读:
    Python脚本文件(.py)打包为可执行文件(.exe)即避免命令行中包含Python解释器
    MVC 三步完成增删改查设计
    MVC中使用SqlServerCe
    回车转Tab
    动态代码
    Mvc 用户没有登录跳转到登录界面
    Mvc
    Mvc提交
    EF查询 linq
    EF数据迁移 Migrations
  • 原文地址:https://www.cnblogs.com/rainybunny/p/14956355.html
Copyright © 2011-2022 走看看