zoukankan      html  css  js  c++  java
  • BZOJ1877 [SDOI2009]晨跑 【费用流】

    题目

    Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等 等,不过到目前为止,他
    坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一
    个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室
    编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以
    在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,
    他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间
    都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。

    输入格式

    第一行:两个数N,M。表示十字路口数和街道数。
    接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。
    N ≤ 200,M ≤ 20000。

    输出格式

    两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。

    输入样例

    7 10

    1 2 1

    1 3 1

    2 4 1

    3 4 1

    4 5 1

    4 6 1

    2 5 5

    3 6 6

    5 7 1

    6 7 1

    输出样例

    2 11

    题解

    拆点费用流
    流量就是所求周期
    费用即为路程长

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
    using namespace std;
    const int maxn = 505,maxm = 100005,INF = 0x7fffffff;
    inline int RD(){
        int out = 0,flag = 1; char c = getchar();
        while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
        while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
        return out * flag;
    }
    int N,M,h[maxn],ne = 0,S,T;
    struct EDGE{int from,to,nxt,f; LL w;}ed[maxm];
    inline void build(int u,int v,int f,LL w){
        ed[ne] = (EDGE){u,v,h[u],f,w}; h[u] = ne++;
        ed[ne] = (EDGE){v,u,h[v],0,-w}; h[v] = ne++;
    }
    int p[maxn],inq[maxn],minf[maxn];
    LL d[maxn],flow = 0,cost = 0;
    void maxcost(){
        queue<int> q; int u,to;
        while (true){
            for (int i = 0; i <= T; i++) d[i] = INF;
            minf[S] = INF; d[S] = 0; inq[S] = true; q.push(S);
            while (!q.empty()){
                u = q.front(); q.pop();
                inq[u] = false;
                Redge(u) if (ed[k].f && d[to = ed[k].to] > d[u] + ed[k].w){
                    d[to] = d[u] + ed[k].w; p[to] = k; minf[to] = min(ed[k].f,minf[u]);
                    if (!inq[to]) q.push(to),inq[to] = true;
                }
            }
            if (d[T] == INF) break;
            flow += minf[T]; cost += (LL)minf[T] * d[T];
            u = T;
            while (u != S){
                ed[p[u]].f -= minf[T]; ed[p[u] ^ 1].f += minf[T];
                u = ed[p[u]].from;
            }
        }
    }
    int main(){
        memset(h,-1,sizeof(h));
        N = RD(); M = RD(); S = 1; T = 2 * N; LL a,b,w;
        for (int i = 2; i < N; i++) build(i,i + N,1,0);
        build(1,1 + N,INF,0); build(N,N + N,INF,0);
        while (M--){
            a = RD(); b = RD(); w = RD();
            build(a + N,b,1,w);
        }
        maxcost();
        printf("%lld %lld",flow,cost);
        return 0;
    }
    
  • 相关阅读:
    【转】概率主题模型简介 Introduction to Probabilistic Topic Models
    codility: Fibonacci numbers (FibFrog, Ladder)
    codility: Euclidean algorithm ( ChocolatesByNumbers, CommonPrimeDivisors)
    effective c++ 11: Handle assignment to self in operator =
    effective c++ 10: Have assignment operators return a reference to *this
    effective c++ 9: Never call virtual functions during construction or destruction
    JDBC连接数据库基础
    day14
    集合方法
    day10
  • 原文地址:https://www.cnblogs.com/Mychael/p/8282733.html
Copyright © 2011-2022 走看看