zoukankan      html  css  js  c++  java
  • Vijos 学姐的逛街计划

    传送门

    题解传送门 

    线性规划,最小费用最大流。

    神奇的操作。

    //Achen
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<ctime>
    #include<cmath>
    #define inf 1e18
    const int N=10007; 
    typedef long long LL;
    using namespace std;
    int n,k;
    LL c[N];
    
    template<typename T> void read(T &x) {
        char ch=getchar(); x=0; T f=1;
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') f=-1,ch=getchar();
        for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    struct edge {
        int u,v,nx;
        LL fl,cap,cost;
        edge(){}
        edge(int u,int v,LL fl,LL cap,LL cost,int nx):u(u),v(v),fl(fl),cap(cap),cost(cost),nx(nx){} 
    }e[N]; 
    
    int fir[N],ecnt=1;
    void add(int u,int v,LL cap,LL cost) {
        e[++ecnt]=edge(u,v,0,cap,cost,fir[u]); fir[u]=ecnt;
        e[++ecnt]=edge(v,u,0,0,-cost,fir[v]); fir[v]=ecnt;
    }
    
    int vis[N],p[N];
    LL dis[N];
    queue<int>que;
    int spfa(int s,int t) {
        for(int i=1;i<=n;i++) vis[i]=0,dis[i]=inf;
        que.push(s); dis[s]=0;
        while(!que.empty()) {
            int x=que.front();
            que.pop(); vis[x]=0;
            for(int i=fir[x];i;i=e[i].nx) 
            if(e[i].cap>e[i].fl) {
                int y=e[i].v;
                if(dis[y]>dis[x]+e[i].cost) {
                    dis[y]=dis[x]+e[i].cost;
                    p[y]=i; 
                    if(!vis[y]) {
                        vis[y]=1;
                        que.push(y);
                    }
                }
            }
        }
        return dis[t]!=inf;
    }
    
    LL calc(int s,int t) {
        LL fl=inf,res=0;
        for(int i=t;i!=s;i=e[p[i]].u) 
            fl=min(fl,e[p[i]].cap-e[p[i]].fl),
            res+=e[p[i]].cost;
        for(int i=t;i!=s;i=e[p[i]].u) 
            e[p[i]].fl+=fl,e[p[i]^1].fl-=fl;
        return fl*res;
    } 
    
    LL max_flow(int s,int t) {
        LL res=0;
        while(spfa(s,t)) 
            res+=calc(s,t);
        return res;
    }
    
    int main() {
        read(n); read(k);
        for(int i=1;i<=3*n;i++) read(c[i]);
        int s=2*n+3,t=s+1;
        add(s,2*n+1,k,0);
        add(2*n+2,t,k,0);
        for(int i=1;i<=n;i++) {
            add(i,2*n+2,1,-c[i]);
            add(2*n+1,n+i,1,-c[2*n+i]);
            add(n+i,i,1,-c[n+i]);
        } 
        for(int i=2;i<=2*n;i++) add(i,i-1,k,0);
        add(1,2*n+2,k,0);
        add(2*n+1,2*n,k,0);
        n=t;
        LL ans=-max_flow(s,t);
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    (十三)页面权限控制
    (十二)用户管理模块
    Vue笔记:生命周期和钩子函数
    (十一)第三方图标库
    (十)动态加载菜单
    windows下php配置环境变量
    docker在mac下安装及配置阿里云镜像加速
    pm2-web监控
    PHP判断两个矩形是否相交
    ubuntu下安装ffmpeg扩展
  • 原文地址:https://www.cnblogs.com/Achenchen/p/8394898.html
Copyright © 2011-2022 走看看