• 深海机器人问题


    题目描述

    题解:

    最大费用最大流。

    建图很简单,就是将机器人作为流,进入就从$S$向内流,出来就从图向$T$流。

    代码:

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define N 300
    #define ll long long
    const int inf = 0x3f3f3f3f;
    const ll Inf  = 0x3f3f3f3f3f3f3f3fll;
    inline int rd()
    {
        int f=1,c=0;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){c=10*c+ch-'0';ch=getchar();}
        return f*c;
    }
    int a,b,P,Q,S,T,hed[N],cnt=-1;
    int _id(int x,int y){return x*(Q+1)+y;}
    struct EG
    {
        int to,nxt;
        ll w,c;
    }e[10*N];
    void ae(int f,int t,ll w,ll c)
    {
        e[++cnt].to = t;
        e[cnt].nxt = hed[f];
        e[cnt].w = w;
        e[cnt].c = c;
        hed[f] = cnt;
    }
    queue<int>q;
    ll dis[N],fl[N];
    int pre[N],fa[N];
    bool vis[N];
    bool spfa()
    {
        memset(dis,0x3f,sizeof(dis));
        dis[S] = 0,fl[S] = Inf,vis[S] = 1;
        q.push(S);
        while(!q.empty())
        {
            int u = q.front();
            q.pop();
            for(int j=hed[u];~j;j=e[j].nxt)
            {
                int to = e[j].to;
                if(e[j].w&&dis[to]>dis[u]+e[j].c)
                {
                    dis[to] = dis[u]+e[j].c;
                    fl[to] = min(fl[u],e[j].w);
                    pre[to] = j,fa[to] = u;
                    if(!vis[to])
                    {
                        vis[to] = 1;
                        q.push(to);
                    }
                }
            }
            vis[u] = 0;
        }
        return dis[T]!=Inf;
    }
    ll mcmf()
    {
        ll ret = 0;
        while(spfa())
        {
            ret+=fl[T]*dis[T];
            int u = T;
            while(u!=S)
            {
                e[pre[u]].w-=fl[T];
                e[pre[u]^1].w+=fl[T];
                u=fa[u];
            }
        }
        return ret;
    }
    int main()
    {
        a = rd(),b = rd(),P = rd(),Q = rd();
        memset(hed,-1,sizeof(hed));
        for(int i=0;i<=P;i++)
            for(int c,j=0;j<Q;j++)
            {
                int f = _id(i,j);
                int t = _id(i,j+1);
                c = rd();
                ae(f,t,1,-c);
                ae(t,f,0,c);
                ae(f,t,Inf,0);
                ae(t,f,0,0);
            }
        for(int i=0;i<=Q;i++)
            for(int c,j=0;j<P;j++)
            {
                int f = _id(j,i);
                int t = _id(j+1,i);
                c = rd();
                ae(f,t,1,-c);
                ae(t,f,0,c);
                ae(f,t,Inf,0);
                ae(t,f,0,0); 
            }
        S = _id(P,Q)+1,T = S+1;
        for(int w,x,y,i=1;i<=a;i++)
        {
            w = rd(),x = rd(),y = rd();
            int t = _id(x,y);
            ae(S,t,w,0);
            ae(t,S,0,0);
        }
        for(int w,x,y,i=1;i<=b;i++)
        {
            w = rd(),x = rd(),y = rd();
            int f = _id(x,y);
            ae(f,T,w,0);
            ae(T,f,0,0);
        }
        printf("%lld
    ",-mcmf());
        return 0;
    }
  • 相关阅读:
    Bate版本控制报告
    【探路者】第五周立会报告6(总第32次)
    【探路者】第五周立会报告5(总第31次)
    【探路者】第五周立会报告4(总第30次)
    【探路者】第五周立会报告3(总第29次)
    【探路者】第五周立会报告2(总第28次)
    例行报告
    【探路者】第五周立会报告1(总第27次)
    【探路者】第四周立会报告7(总第26次)
    “Hello world!”团队第三周贡献分规则
  • 原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10255940.html
Copyright © 2020-2023  润新知