zoukankan      html  css  js  c++  java
  • luogu P4015 运输问题

    luogu P4015 运输问题

    // luogu-judger-enable-o2
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    #define INF 0x7fffffff
    const int maxn = 2007;
    using std::min;
    using std::queue;
    int dis[maxn];bool vis[maxn];
    inline int read() {
        int x=0,f=1;
        char c=getchar() ;
        while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
        return x*f;
    }
    int S,T,n,m,pre[maxn],Min_Cost;
    struct node{
        int u,v,cost,flow,next;
    }edge[(maxn*10)<<1];
    int num=1,head[maxn];
    void add_edge(int u,int v,int w,int cost)  {
        edge[++num].v=v;edge[num].u=u;edge[num].flow=w;edge[num].cost=cost,edge[num].next=head[u],head[u]=num;
    }
    bool spfa() {
        memset(vis,0,sizeof vis);
        memset(dis,0x3f,sizeof dis);
        queue<int>que;
        que.push(S);vis[S]=1,dis[S]=0;
        while(!que.empty())  {
            int x=que.front();que.pop(); 
            for(int i=head[x];i;i=edge[i].next ) {
                int v=edge[i].v;
                if(dis[x]+edge[i].cost<dis[v]&&edge[i].flow>0) {
                    pre[v]=i;
                    dis[v]=dis[x]+edge[i].cost;
                    if(!vis[v])vis[v]=1,que.push(v);
                }
            }
            vis[x]=0;
        }
        return dis[T]!=0x3f3f3f3f;
    }
    void calc() {
        int MF=0x3f3f3f3f;
        for(int i=T;i!=S;i=edge[pre[i]].u) 
            MF=min(MF,edge[pre[i]].flow);
        for(int i=T;i!=S;i=edge[pre[i]].u) {
            edge[pre[i]].flow-=MF;
            edge[pre[i]^1].flow+=MF;
            Min_Cost+=edge[pre[i]].cost*MF;
        }
    }
    void MFMC() {
        while(spfa())
        calc();
    }
    int co[107][207];
    int ra[107],rb[107];
    int main() {
        m=read();n=read();S=0,T=m+n+1;
        for(int i=1;i<=m;++i) 
            add_edge(S,i,ra[i]=read(),0),add_edge(i,S,0,0);
        for(int i=1;i<=n;++i)
            add_edge(m+i,T,rb[i]=read(),0),add_edge(T,m+i,0,0);
        for(int i=1;i<=m;++i) 
            for(int j=m+1;j<=m+n;++j)
                add_edge(i,j,INF,co[i][j]=read()),add_edge(j,i,0,-co[i][j]);
        MFMC();printf("%d
    ",Min_Cost);
        Min_Cost=0,num=1,memset(head,0,sizeof head);
        
        for(int i=1;i<=m;++i) 
            add_edge(S,i,ra[i],0),add_edge(i,S,0,0);
        for(int i=1;i<=n;++i)
            add_edge(m+i,T,rb[i],0),add_edge(T,m+i,0,0);
        for(int i=1;i<=m;++i) 
            for(int j=m+1;j<=m+n;++j)
                add_edge(i,j,INF,-co[i][j]),add_edge(j,i,0,co[i][j]);
        MFMC();
        printf("%d
    ",-Min_Cost);
        return 0;
    }
    
  • 相关阅读:
    google说 老子 = I !
    昨日种种死 今日种种生
    设定Access数据库自增长字段初始值
    [c路历程]品品数组这杯茶
    爱上位运算
    .Net中的委托
    Jquery css函数用法(判断标签是否拥有某属性)
    记录几条简单的正则表达式
    ASP.NET MVC中DropDownList的使用
    C#如何获取object对象的属性值
  • 原文地址:https://www.cnblogs.com/sssy/p/8562941.html
Copyright © 2011-2022 走看看