• [SDOI2009]晨跑


    这道题是一个很裸的费用流题目。

    一般点之过一次的套路就是拆点连边。

    其他的模拟下就水过去了。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define re register
     6 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
     7 #define repd(i, a, b) for (re int i = a; i >= b; --i)
     8 #define maxx(a, b) a = max(a, b);
     9 #define minn(a, b) a = min(a, b);
    10 #define LL long long
    11 #define INF (1 << 30)
    12 
    13 inline int read() {
    14     int w = 0, f = 1; char c = getchar();
    15     while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
    16     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar();
    17     return w * f;
    18 }
    19 
    20 const int maxn = 200 + 10, maxm = 20000 + 10;
    21 
    22 struct Edge {
    23     int u, v, c, f, w, pre;
    24 };
    25 
    26 int mincost = INF;
    27 
    28 struct Graph {
    29     Edge ed[maxm << 2];
    30     int n, m, G[maxn << 1];
    31     void init(int n) {
    32         this->n = n;
    33         m = 1;
    34         memset(G, 0, sizeof(G));
    35     }
    36     void add(int u, int v, int c, int w) {
    37         ed[++m] = (Edge){u, v, c, 0, w, G[u]};
    38         G[u] = m;
    39         ed[++m] = (Edge){v, u, 0, 0, -w, G[v]};
    40         G[v] = m;
    41     }
    42     int a[maxn << 1], d[maxn << 1], p[maxn << 1], inq[maxn << 1];
    43     int s, t;
    44     queue<int> Q;
    45     bool spfa(int &flow, int &cost) {
    46         memset(inq, 0, sizeof(inq));
    47         rep(i, 1, n) d[i] = INF;
    48         d[s] = 0;
    49         a[s] = INF;
    50         Q.push(s); inq[s] = 1;
    51         while (!Q.empty()) {
    52             int u = Q.front(); Q.pop(); inq[u] = 0;
    53             for (register int i = G[u]; i; i = ed[i].pre) {
    54                 Edge &e = ed[i];
    55                 if (e.f < e.c && d[u] + e.w < d[e.v]) {
    56                     d[e.v] = d[u] + e.w;
    57                     a[e.v] = min(a[u], e.c-e.f);
    58                     p[e.v] = i;
    59                     if (!inq[e.v]) Q.push(e.v), inq[e.v] = 1;
    60                 }
    61             }
    62         }
    63         if (d[t] == INF) return false;
    64         flow += a[t];
    65         cost += a[t] * d[t];
    66         for (register int i = p[t]; i; i = p[ed[i].u]) {
    67             ed[i].f += a[t];
    68             ed[i^1].f -= a[t];
    69         }
    70         return true;
    71     }
    72     int mcmf(int s, int t, int &cost) {
    73         this->s = s, this->t = t;
    74         int flow = 0; cost = 0;
    75         while (spfa(flow, cost));
    76         return flow;
    77     }
    78 } G;
    79 
    80 int n, m;
    81 
    82 int main() {
    83     n = read(), m = read(); G.init(n*2);
    84     rep(i, 1, m) {
    85         int u = read(), v = read(), w = read();
    86         G.add(u+n, v, 1, w);
    87     }
    88     rep(i, 2, n-1) G.add(i, i+n, 1, 0);
    89     G.add(n, n*2, INF, 0);
    90     G.add(1, n+1, INF, 0);
    91     int cost;
    92     printf("%d", G.mcmf(1, n*2, cost));
    93     printf(" %d", cost);
    94     return 0;
    95 }
  • 相关阅读:
    bzoj2733: [HNOI2012]永无乡
    bzoj3141: [Hnoi2013]旅行
    bzoj3144: [Hnoi2013]切糕
    bzoj3140: [Hnoi2013]消毒
    bzoj3139: [Hnoi2013]比赛
    bzoj3142: [Hnoi2013]数列
    bzoj3572: [Hnoi2014]世界树
    bzoj2286: [Sdoi2011]消耗战
    bzoj3611: [Heoi2014]大工程
    The Unsolvable Problem
  • 原文地址:https://www.cnblogs.com/ac-evil/p/10367440.html
Copyright © 2020-2023  润新知