zoukankan      html  css  js  c++  java
  • 种树 3(差分约束)

    种树 3

    题目描述:
    为了绿化乡村,H村积极响应号召,开始种树了。
    H村里有n幢房屋,这些屋子的排列顺序很有特点,在一条直线上。于是方便起见,我们给它们标上1~n。树就种在房子前面的空地上。
    同时,村民们向村长提出了m个意见,每个意见都是按如下格式:希望第li个房子到第ri个房子的房前至少有ci棵树。
    因为每个房屋前的空地面积有限,所以每个房屋前最多只能种ki棵树。
    村长希望在满足村民全部要求的同时,种最少的树以节约资金。请你帮助村长。
    输入描述:
    输入第1行,包含两个整数n,m。
    第2行,有n个整数ki。
    第3~m+1行,每行三个整数li,ri,ci。
    输出描述:
    输出1个整数表示在满足村民全部要求的情况下最少要种的树。村民提的要求是可以全部满足的。
    样例输入:
    4 3
    3 2 4 1
    1 2 4
    2 3 5
    2 4 6
    样例输出:
    8
    数据范围及提示:
    对于30%的数据,0

    #include<iostream>
    #include<cstdio>
    #include<queue>
    using namespace std;
    const int maxn=500010;
    int n,m,a[maxn],tot,head[maxn];
    int dis[maxn],max_ans;
    bool flag[maxn];
    struct node
    {
        int to;
        int next;
        int w;
    }e[maxn*4];
    int init()
    {
        int p=0;char c=getchar();if(c>'9'||c<'0')c=getchar();
        while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
        return p;
    }
    void add_edge(int u,int v,int w)
    {
        tot++;
        e[tot].to=v;
        e[tot].w=w;
        e[tot].next=head[u];
        head[u]=tot;
    }
    void spfa()
    {
        queue<int> q;
        for(int i=1;i<=n;i++)
        dis[i]=-0x3f3f3f3f;
        dis[0]=0;flag[0]=1;
        q.push(0);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            flag[u]=0;
            for(int i=head[u];i;i=e[i].next)
            {
                int v=e[i].to;
                if(dis[v]<dis[u]+e[i].w)
                {
                    dis[v]=dis[u]+e[i].w;
                    if(!flag[v])
                    {
                        q.push(v);
                        flag[v]=1;
                    }
                }
            }
        }
    }
    int main()
    {
        int x,y,z;
        n=init();m=init();
        for(int i=1;i<=n;i++)
        a[i]=init();
        for(int i=1;i<=m;i++)
        {
            x=init();y=init();z=init();
            add_edge(x-1,y,z);
        }
        for(int i=1;i<=n;i++)
        {
            add_edge(i-1,i,0);
            add_edge(i,i-1,-a[i]);
        }
        spfa();
        cout<<dis[n];
        return 0;
    }
  • 相关阅读:
    RHEL7.2安装及配置实验环境
    VMwareworkstation 12安装
    Iterator主要有三个方法:hasNext()、next()、remove()详解
    httpclient
    http接口测试——Jmeter接口测试实例讲解
    java获取Excel的导出
    java获取Excel的导入
    java的post请求
    java的get请求
    Python3 列表(List)基础
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070947.html
Copyright © 2011-2022 走看看