神奇MLE
查看原帖
神奇MLE
251723
Schwarzkopf_Henkal楼主2020/12/27 18:21

rt,MLE#2

不清楚啥原因,INF都在1e12级别以上,大概不是这个问题,本地跑不出来

#include<bits/stdc++.h>
using namespace std;
struct Edge{
    int u,v;
    long long c,w,s;//Capacity Flow Cost
};
struct ssp{
    const static int N=1000005;
    int n,m,s,t;
    vector<Edge>E;
    vector<int>to[N];
    long long dis[N],C[N],ret;//去掉了当前弧优化 | 又加上了(
    bool vis[N];
    void clear(int n){
        for(int i=1;i<=n;i++)
            to[i].clear();
        E.clear();
    }
    void AddEdge(int u,int v,long long w,long long s){
        E.push_back({u,v,w,0,s});
        E.push_back({v,u,0,0,-s});
        m=E.size();
        to[u].push_back(m-2);
        to[v].push_back(m-1);
    }
    bool spfa(){
        memset(dis,6,sizeof(dis));
        queue<int>que;
        que.push(s);
        dis[s]=0;
        vis[s]=1;
        while(!que.empty()){
            int cur=que.front();
            que.pop();
            vis[cur]=0;
            for(int i=0;i<to[cur].size();i++){
                Edge& e=E[to[cur][i]];
                if(e.c>e.w&&dis[e.v]>dis[cur]+e.s){
                    dis[e.v]=dis[cur]+e.s;
                    if(!vis[e.v]){
                        que.push(e.v);
                        vis[e.v]=1;
                    }
                }
            }
        }
        return dis[t]<=1e15;
    }
    long long dfs(int u,long long v){
        if(u==t||v==0)
            return v;
        long long w=0,f;
        vis[u]=1;
        for(int i=C[u];i<to[u].size()&&v;i++){
            C[u]=i;
            Edge& e=E[to[u][i]];
            if(!vis[e.v]&&dis[u]+e.s==dis[e.v]&&(f=dfs(e.v,min(v,e.c-e.w)))>0){
                ret+=f*e.s;
                e.w+=f;
                E[to[u][i]^1].w-=f;
                w+=f;
                v-=f;
            }
        }
        vis[u]=0;
        return w;
    }
    pair<long long,long long> MaxFaFaflow(int s,int t){
        this->s=s;
        this->t=t;
        ret=0;
        long long res=0,cur;
        while(spfa()){
            memset(C,0,sizeof(C));
            while(cur=dfs(s,1e18))
                res+=cur;
        }
        return make_pair(res,ret);
    }
}R;
int n,a[2005],o[10];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        R.AddEdge(1,i*2+2,a[i],0);
        R.AddEdge(i*2+2-1,2,a[i],0);
    }
    scanf("%d",&o[1]);
    for(int i=1;i<=n;i++)
        R.AddEdge(1,i*2+2-1,1e15,o[1]);
    scanf("%d%d",&o[2],&o[3]);
    for(int i=1;i+o[2]<=n;i++)
        for(int j=i+o[2];j<=n;j++)
            R.AddEdge(i*2+2,j*2+2-1,1e15,o[3]);
    scanf("%d%d",&o[4],&o[5]);
    for(int i=1;i+o[4]<=n;i++)
        for(int j=i+o[4];j<=n;j++)
            R.AddEdge(i*2+2,j*2+2-1,1e15,o[5]);
    printf("%lld",R.MaxFaFaflow(1,2).second);
}/*

*/
2020/12/27 18:21
加载中...