zoukankan      html  css  js  c++  java
  • BZOJ3996 [TJOI2015]线性代数

    就是求$D = A imes B imes A^T - C imes A^T$

    展开也就是$$D = sum_{i, j} A_i * A_j * B_{i, j} - sum_{i} C_i * A_i$$

    其中$Ai = 0 or 1$

    转化成最小割模型,就是一堆东西,选了$i$号物品要支付费用$C_i$,同时选$i$和$j$两个物品可以获得$B_{i, j}$的收益

    于是非常简单啦,建图什么的直接看程序好了!

     1 /**************************************************************
     2     Problem: 3996
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:476 ms
     7     Memory:51612 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <cstring>
    12 #include <algorithm>
    13  
    14 using namespace std;
    15 const int N = 505 * 505;
    16 const int M = N << 4;
    17 const int inf = 1e9;
    18  
    19 struct edge {
    20     int next, to, f;
    21     edge() {}
    22     edge(int _n, int _t, int _f) : next(_n), to(_t), f(_f) {}
    23 } e[M];
    24  
    25 int n, ans, S, T;
    26 int first[N], tot = 1;
    27 int d[N], q[N];
    28  
    29 inline int read();
    30  
    31 inline void Add_Edges(int x, int y, int f) {
    32     e[++tot] = edge(first[x], y, f), first[x] = tot;
    33     e[++tot] = edge(first[y], x, 0), first[y] = tot;
    34 }
    35  
    36 #define y e[x].to
    37 #define p q[l]
    38 bool bfs() {
    39     int l, r, x;
    40     memset(d, -1, sizeof(d));
    41     d[q[1] = S] = 1;
    42     for (l = r = 1; l != r + 1; ++l)
    43         for (x = first[p]; x; x = e[x].next)
    44             if (!~d[y] && e[x].f) {
    45                 d[q[++r] = y] = d[p] + 1;
    46                 if (y == T) return 1;
    47             }
    48     return 0;
    49 }
    50 #undef p
    51  
    52 int dfs(int p, int lim) {
    53   if (p == T || !lim) return lim;
    54   int x, tmp, rest = lim;
    55   for (x = first[p]; x && rest; x = e[x].next) 
    56     if (d[y] == d[p] + 1 && ((tmp = min(e[x].f, rest)) > 0)) {
    57       rest -= (tmp = dfs(y, tmp));
    58       e[x].f -= tmp, e[x ^ 1].f += tmp;
    59       if (!rest) return lim;
    60     }
    61   if (rest) d[p] = -1;
    62   return lim - rest;
    63 }
    64 #undef y
    65  
    66 int Dinic() {
    67   int res = 0;
    68   while (bfs())
    69     res += dfs(S, inf);
    70   return res;
    71 }
    72  
    73 int main() {
    74     int i, j, x, now;
    75     n = now = read(), S = n * n + n + 1, T = S + 1;
    76     for (i = 1; i <= n; ++i)
    77         for (j = 1; j <= n; ++j) {
    78             x = read(), ++now;
    79             Add_Edges(i, now, inf), Add_Edges(j, now, inf);
    80             Add_Edges(now, T, x);
    81             ans += x;
    82         }
    83     for (i = 1; i <= n; ++i) Add_Edges(S, i, read());
    84     printf("%d
    ", ans - Dinic());
    85     return 0;
    86 }
    87  
    88 inline int read() {
    89     static int x;
    90     static char ch;
    91     x = 0, ch = getchar();
    92     while (ch < '0' || '9' < ch)
    93         ch = getchar();
    94     while ('0' <= ch && ch <= '9') {
    95         x = x * 10 + ch - '0';
    96         ch = getchar();
    97     }
    98     return x;
    99 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/rausen/p/4454595.html
Copyright © 2011-2022 走看看