zoukankan      html  css  js  c++  java
  • hdu6188&&百度之星初赛(B) T5

    度度熊的交易计划

    Problem Description

    度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题:

    喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区。

    由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个。

    同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品。

    由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益。

    据测算,每一个商品运输1公里,将会花费1元。

    那么喵哈哈村最多能够实现多少盈利呢?

    Input

    本题包含若干组测试数据。 每组测试数据包含: 第一行两个整数n,m表示喵哈哈村由n个片区、m条街道。 接下来n行,每行四个整数a[i],b[i],c[i],d[i]表示的第i个地区,能够以a[i]的价格生产,最多生产b[i]个,以c[i]的价格出售,最多出售d[i]个。 接下来m行,每行三个整数,u[i],v[i],k[i],表示该条公路连接u[i],v[i]两个片区,距离为k[i]

    可能存在重边,也可能存在自环。

    满足: 1<=n<=500, 1<=m<=1000, 1<=a[i],b[i],c[i],d[i],k[i]<=1000, 1<=u[i],v[i]<=n

    Output

    输出最多能赚多少钱。

    Sample Input
    2 1
    5 5 6 1
    3 5 7 7
    1 2 1
    
    Sample Output
    23
    ———————————————————————————————————————————————
    这道题是道很明显的网络流 建一波图就好了 注意是最小费用流不是最小费用最大流 当d【T】>=0时就没有必要继续跑下去了
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    using namespace std;
    const int M=1007,inf=0x3f3f3f3f;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9') {ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,m,S,T,ans;
    int first[M],cur[M],cnt,d[M],q[10010],vis[M];
    struct node{int to,next,flow,cost;}e[500000];
    void insert(int a,int b,int flow,int cost){
        e[++cnt]=(node){b,first[a],flow,cost}; first[a]=cnt;
        e[++cnt]=(node){a,first[b],0,-cost}; first[b]=cnt;
    }
    int spfa(){
        memset(d,0x3f,sizeof(d));
        int head=0,tail=1; 
        q[0]=S;  d[S]=0;
        while(head!=tail){
            int x=q[head++]; vis[x]=0; if(head>10010) head=0;
            for(int i=first[x];i;i=e[i].next){
                int now=e[i].to;
                if(e[i].flow&&d[now]>d[x]+e[i].cost){
                    d[now]=d[x]+e[i].cost;
                    if(!vis[now]){q[tail++]=now; vis[now]=1; if(tail>10010) tail=0;}
                }
            }
        }
        return d[T]<0;
    }
    int dfs(int x,int a){
        if(x==T||a==0) return a;
        vis[x]=1;
        int f,flow=0;
        for(int &i=cur[x];i;i=e[i].next){
            int now=e[i].to;
            if(!vis[now]&&d[now]==d[x]+e[i].cost&&(f=dfs(now,min(a,e[i].flow)))>0){
                e[i].flow-=f; e[i^1].flow+=f;
                flow+=f; ans+=e[i].cost*f;
                a-=f; if(a==0) break;
            }
        }
        vis[x]=0;
        return flow;
    }
    int main()
    {
        int x,y,w;
        while(scanf("%d %d",&n,&m)==2){
            memset(first,0,sizeof(first));
            ans=0; cnt=1;
            S=0; T=n+1;
            for(int i=1;i<=n;i++){
                x=read(); w=read(); insert(S,i,w,x);
                x=read(); w=read(); insert(i,T,w,-x);
            }
            for(int i=1;i<=m;i++){
                x=read(); y=read(); w=read();
                if(x==y) continue;
                insert(x,y,inf,w);
                insert(y,x,inf,w);
            }
            memset(vis,0,sizeof(vis));
            while(spfa()) {for(int i=S;i<=T;i++) cur[i]=first[i]; dfs(S,inf);}
            printf("%d
    ",-ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    数字图像处理的Matlab实现(2)—MATLAB基础
    数字图像处理的Matlab实现(1)—绪论
    统计分析与R软件-chapter2-6
    统计分析与R软件-chapter2-5
    统计分析与R软件-chapter2-3
    题目1143:Primary Arithmetic
    剑指OFFER之翻转单词顺序
    剑指OFFER之把数组排成最小的数
    剑指OFFER之丑数
    最大的两个数
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7354500.html
Copyright © 2011-2022 走看看