HDU 6437 Problem L.Videos (最大费用)【费用流】

<题目链接>

题目大意:

一天有N个小时,有m个节目(每种节目都有类型),有k个人,连续看相同类型的节目会扣w快乐值。每一种节目有都一个播放区间[l,r]。每个人同一时间只能看一个节目,看完可以获得快乐值,每个节目只能被人看一次。问最多可以获得多少快乐?

解题分析:

本题用费用流求解的方式还是比较直观的。因为本题要求的是最大费用,所以我们需要建图的时候需要将所有实际费用取反,然后将最后最小费用最大流求出的答案取反,就是要求的最大费用。具体建图过程见代码:

#include <bits/stdc++.h>
using namespace std;

#define clr(a,b) memset(a,b,sizeof(a))
template<typename T>
inline void read(T&x){
    x=0;int 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(); }
    x*=f;
}

//最小费用最大流模板
struct MCMF{
    static const int N = 5e4+100, M = 5e5+5, INF = 0x7fffffff; 

    int n, m, head[N], s, t, cnt;
    int dist[N], inq[N], pre[N], incf[N];
    int mxflow, mncost;
    struct Edge{ int to, cap, cost, next; } edge[M * 4];

    inline void init(int l, int r, int ss, int tt){
        //for(int i = l; i <= r; i++ ){head[i] = -1;}
        memset(head, -1, sizeof(head));
        s = ss, t = tt, cnt = 1;
        mxflow = mncost = 0;
    }
    inline void add(int u,int v,int cap,int cost){
        edge[++cnt]=(Edge){v,cap,cost,head[u]};head[u]=cnt;
        edge[++cnt]=(Edge){u,0,-cost,head[v]};head[v]=cnt;
    }

    bool spfa(int s, int t){       //slf优化的spfa(双端队列优化)
        for(int i = 0; i < N; i++)
            dist[i] = INF, inq[i] = 0;
        clr(pre,0);
        deque<int>q;
        inq[s]=1,dist[s] = 0;
        q.push_back(s);
        incf[s] = INF;
        while(!q.empty()){     
            int u = q.front();q.pop_front();
            inq[u] = 0;
            for(int i=head[u];~i;i=edge[i].next){
                int v=edge[i].to,cap=edge[i].cap,cost=edge[i].cost;
                if(cap>0 && dist[v]>dist[u]+cost){     //更新每个点的最小费用
                    dist[v]=dist[u]+cost;
                    incf[v]=min(incf[u], cap);     //得到v点所在路径上的最小容量
                    pre[v]=i;     //记录下这个点的前驱正向边
                    if(!inq[v]){
                        inq[v]=1;
                        if(q.empty() || dist[v]>dist[q.front()])q.push_back(v);
                        else q.push_front(v);       //如果最小费用小于等于队首,直接塞入队列首
                    }
                }
            }
        }
        return dist[t]!=INF;
    }
    void update(int s,int t){
        int x=t;
        while(x!=s){
            int pos=pre[x];
            edge[pos].cap-=incf[t];      
            edge[pos^1].cap+=incf[t];
            x=edge[pos^1].to;
        }
        mxflow+=incf[t];
        mncost+=dist[t]*incf[t];
    }
    void minCostMaxFlow(int s,int t){
        while(spfa(s,t))
            update(s,t);
    }
}mcmf;

const int NN = 500 + 7;
struct Node{ int l, r, w, fp; } node[NN];

int st,ed;
inline void GetMap(){
    int n,m,k,w;
    read(n);read(m);read(k);read(w);
    st=0,ed=2*m+2;       //0代表源点,2*m+1代表慈元典,ed代表汇点
    mcmf.init(st,ed,st,ed);
    mcmf.add(st,2*m+1,k,0);      //源点向次源点连一条容量为k,费用为0的边
    for(int i=1;i<=m;i++)
        scanf("%d%d%d%d",&node[i].l,&node[i].r,&node[i].w,&node[i].fp);
    for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            if(i==j)continue;
            if(node[i].r<=node[j].l)     //对于那些满足条件的video, i的出点向j的入点连一条容量为1,费用为0(或者如果这两个点类型相同的话,费用就为W,因为本题是将所有费用置为它的相反数了)
                mcmf.add(i+m,j,1,(node[i].fp==node[j].fp)?w:0);      //因为本题是求最大费用,所以要将所有费用取反,这里就是 w 
        }
    }
    for(int i=1;i<=m;i++)
        mcmf.add(i,i+m,1,-node[i].w);   //拆点,所有点的入点向入点连一条容量为1,费用为node[i].w的边
    for(int i=1;i<=m;i++)
        mcmf.add(2*m+1,i,1,0);     //源点向所有的点连上一条容量为1,费用为0的边
    for(int i=1;i<=m;i++)
        mcmf.add(i+m,ed,1,0);      //所有点的出度连一条容量为1,费用为0的边
}
inline void Solve(){
    mcmf.minCostMaxFlow(st,ed);
    printf("%d\n",-mcmf.mncost);     //取相反数,就是实际意义上的最大费用
}
int main(){
    int T;cin>>T;
    while(T--){
        GetMap();
        Solve();
    }
}

 

转载于:https://www.cnblogs.com/00isok/p/10705047.html

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据程管理可以确保数据程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据程架构,制定详细的数据管理程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值