<题目链接>

题目大意:

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

解题分析:

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define clr(a,b) memset(a,b,sizeof(a))
  5. template<typename T>
  6. inline void read(T&x){
  7. x=;int f=;char c=getchar();
  8. while(c<'' || c>''){ if(c=='-')f=-;c=getchar(); }
  9. while(c>='' && c<=''){ x=x*+c-'';c=getchar(); }
  10. x*=f;
  11. }
  12.  
  13. //最小费用最大流模板
  14. struct MCMF{
  15. static const int N = 5e4+, M = 5e5+, INF = 0x7fffffff;
  16.  
  17. int n, m, head[N], s, t, cnt;
  18. int dist[N], inq[N], pre[N], incf[N];
  19. int mxflow, mncost;
  20. struct Edge{ int to, cap, cost, next; } edge[M * ];
  21.  
  22. inline void init(int l, int r, int ss, int tt){
  23. //for(int i = l; i <= r; i++ ){head[i] = -1;}
  24. memset(head, -, sizeof(head));
  25. s = ss, t = tt, cnt = ;
  26. mxflow = mncost = ;
  27. }
  28. inline void add(int u,int v,int cap,int cost){
  29. edge[++cnt]=(Edge){v,cap,cost,head[u]};head[u]=cnt;
  30. edge[++cnt]=(Edge){u,,-cost,head[v]};head[v]=cnt;
  31. }
  32.  
  33. bool spfa(int s, int t){ //slf优化的spfa(双端队列优化)
  34. for(int i = ; i < N; i++)
  35. dist[i] = INF, inq[i] = ;
  36. clr(pre,);
  37. deque<int>q;
  38. inq[s]=,dist[s] = ;
  39. q.push_back(s);
  40. incf[s] = INF;
  41. while(!q.empty()){
  42. int u = q.front();q.pop_front();
  43. inq[u] = ;
  44. for(int i=head[u];~i;i=edge[i].next){
  45. int v=edge[i].to,cap=edge[i].cap,cost=edge[i].cost;
  46. if(cap> && dist[v]>dist[u]+cost){ //更新每个点的最小费用
  47. dist[v]=dist[u]+cost;
  48. incf[v]=min(incf[u], cap); //得到v点所在路径上的最小容量
  49. pre[v]=i; //记录下这个点的前驱正向边
  50. if(!inq[v]){
  51. inq[v]=;
  52. if(q.empty() || dist[v]>dist[q.front()])q.push_back(v);
  53. else q.push_front(v); //如果最小费用小于等于队首,直接塞入队列首
  54. }
  55. }
  56. }
  57. }
  58. return dist[t]!=INF;
  59. }
  60. void update(int s,int t){
  61. int x=t;
  62. while(x!=s){
  63. int pos=pre[x];
  64. edge[pos].cap-=incf[t];
  65. edge[pos^].cap+=incf[t];
  66. x=edge[pos^].to;
  67. }
  68. mxflow+=incf[t];
  69. mncost+=dist[t]*incf[t];
  70. }
  71. void minCostMaxFlow(int s,int t){
  72. while(spfa(s,t))
  73. update(s,t);
  74. }
  75. }mcmf;
  76.  
  77. const int NN = + ;
  78. struct Node{ int l, r, w, fp; } node[NN];
  79.  
  80. int st,ed;
  81. inline void GetMap(){
  82. int n,m,k,w;
  83. read(n);read(m);read(k);read(w);
  84. st=,ed=*m+; //0代表源点,2*m+1代表慈元典,ed代表汇点
  85. mcmf.init(st,ed,st,ed);
  86. mcmf.add(st,*m+,k,); //源点向次源点连一条容量为k,费用为0的边
  87. for(int i=;i<=m;i++)
  88. scanf("%d%d%d%d",&node[i].l,&node[i].r,&node[i].w,&node[i].fp);
  89. for(int i=;i<=m;i++){
  90. for(int j=;j<=m;j++){
  91. if(i==j)continue;
  92. if(node[i].r<=node[j].l) //对于那些满足条件的video, i的出点向j的入点连一条容量为1,费用为0(或者如果这两个点类型相同的话,费用就为W,因为本题是将所有费用置为它的相反数了)
  93. mcmf.add(i+m,j,,(node[i].fp==node[j].fp)?w:); //因为本题是求最大费用,所以要将所有费用取反,这里就是 w
  94. }
  95. }
  96. for(int i=;i<=m;i++)
  97. mcmf.add(i,i+m,,-node[i].w); //拆点,所有点的入点向入点连一条容量为1,费用为node[i].w的边
  98. for(int i=;i<=m;i++)
  99. mcmf.add(*m+,i,,); //源点向所有的点连上一条容量为1,费用为0的边
  100. for(int i=;i<=m;i++)
  101. mcmf.add(i+m,ed,,); //所有点的出度连一条容量为1,费用为0的边
  102. }
  103. inline void Solve(){
  104. mcmf.minCostMaxFlow(st,ed);
  105. printf("%d\n",-mcmf.mncost); //取相反数,就是实际意义上的最大费用
  106. }
  107. int main(){
  108. int T;cin>>T;
  109. while(T--){
  110. GetMap();
  111. Solve();
  112. }
  113. }

HDU 6437 Problem L.Videos (最大费用)【费用流】的更多相关文章

  1. HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)

    题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...

  2. hdu6437 Problem L.Videos(网络流)

    Problem L.Videos Problem Description: C-bacteria takes charge of two kinds of videos: ’The Collectio ...

  3. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  4. [hdu6437]Problem L. Videos

    题目大意:有$n$个小时,有$m$个节目(每种节目都有类型$0/1$),有$k$个人,一个人连续看相同类型的节目会扣$w$快乐值. 每一种节目有都一个播放区间$[l,r]$.每个人同一时间只能看一个节 ...

  5. HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)

    6330.Problem L. Visual Cube 这个题就是输出立方体.当时写完怎么都不过,后来输出b<c的情况,发现这里写挫了,判断失误.加了点东西就过了,mdzz... 代码: //1 ...

  6. HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  7. HDU 6437 最(大) 小费用最大流

    Problem L.Videos Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  8. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  9. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

随机推荐

  1. JDK环境部署

    JDK环境部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 说起JDK想必大家并不陌生,作为运维的小伙伴,谁不层接触过Java程序员呢?而且在搭建服务上时也必须得接触他,比如to ...

  2. DotNet进阶系列

    一. 回顾历史 回顾个人发展历程,自2012年初次接触开发至今(2018年)已经有六个年头,这期间陆陆续续学习并掌握了不少技术,C#语言.ORM框架.多线程技术.设计模式.前端技术.MVC.MVVM框 ...

  3. 一次多个数据库tnsping及登录单点登录需求

    [环境介绍] 系统环境:Linux + Oracle 11.2.0.4.0 + python 2.7.10 [背景描述] 需求:因为涉及生产数据库较多,业务夸多个数据库使用.当收到业务有些影响时,数据 ...

  4. Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)

    学习架构: 由于Koa2已经支持ES6及更高版本,包括支持async方法,所以请读者保证Node.js版本在7.6.0以上.如果需要在低于7.6的版本中应用Koa的async方法,建议使用Babel ...

  5. react native 安卓home返回键页面刷新

    import { withNavigationFocus } from 'react-navigation'; class Warngreete extends React.Component { c ...

  6. 学习string,stringBuffer时遇到的问题

    今天学习string和stringBuffer.了解了两者的区别,然后去看java api都有啥方法.stringBuffer类有indexOf方法,于是写了下面的代码 String str = &q ...

  7. 将驱动编译进Linux内核

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  8. 一、Python学习之路

    基础篇 第一章         Python介绍.安装.使用 Python 简介 Python 安装 第一个Python程序 Python 解释器 字符编码与解码 动态语言与静态语言的区别 变量及简单 ...

  9. jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法

    一.Jmeter分布式执行原理: 1.Jmeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent). 2.执行时,Controller会把脚本发送到每台A ...

  10. k8s部署etcd数据库集群

    ⒈下载 https://github.com/etcd-io/etcd/releases ⒉解压 tar -zxvf etcd-v3.3.12-linux-amd64.tar.gz ⒊移动可执行文件及 ...