题目大意:

给定n,m,K,W

表示n个小时 m场电影(分为类型A、B)

K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠

接下来给定m场电影的 s t w op

表示电影的 开始时间s 结束时间t 看完这场电影则获得w 电影类型是op(0为A 1为B)

将一场电影拆成两个点 s t,两点间连线花费为-w容量为1

源点与所有电影的s点连线 花费为0容量为1

所有电影的t点与汇点连线 花费为0容量为1

若两场电影的时间不冲突 那么按时间顺序在之间连边

若类型相同 花费为W容量为1 否则 花费为0容量为1

最后设超级源点与源点连边 花费为0容量为K 表示最多K个人

此时求出的 最小花费最大流 的最小花费 就是 最后最少的失去

最少的失去 就是 最大的获得的相反数

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. #define INF 0x3f3f3f3f
  5. #define mem(i,j) memset(i,j,sizeof(i))
  6. #define inc(i,l,r) for(int i=l;i<=r;i++)
  7. #define dec(i,r,l) for(int i=r;i>=l;i--)
  8. const int N=;
  9. const int mod=1e9+;
  10.  
  11. int n,m;
  12. struct NODE { int s,t,w,op; }node[];
  13. struct Edge
  14. {
  15. int from,to,cap,flow,cost;
  16. Edge(int u,int v,int ca,int f,int co):from(u),to(v),cap(ca),flow(f),cost(co){};
  17. };
  18.  
  19. struct MCMF
  20. {
  21. int n,m,s,t;
  22. vector<Edge> edges;
  23. vector<int> G[N];
  24. int inq[N];//是否在队列中
  25. int d[N];//距离
  26. int p[N];//上一条弧
  27. int v[N];//可改进量
  28.  
  29. void init(int n) //初始化 顶点为 0~n-1
  30. {
  31. this->n=n;
  32. for(int i=;i<=n;i++) G[i].clear();
  33. edges.clear();
  34. }
  35.  
  36. void AddEdge(int from,int to,int cap,int cost)//加边
  37. {
  38. edges.push_back(Edge(from,to,cap,,cost));
  39. edges.push_back(Edge(to,from,,,-cost));
  40. int m=edges.size();
  41. G[from].push_back(m-);
  42. G[to].push_back(m-);
  43. }
  44.  
  45. bool SPFA(int s,int t,int &flow,int &cost)//寻找最小费用的增广路,使用引用同时修改原flow,cost
  46. {
  47. for(int i=;i<n;i++) d[i]=INF;
  48. memset(inq,,sizeof(inq));
  49. d[s]=;inq[s]=;p[s]=;v[s]=INF;
  50. queue<int>Q; Q.push(s);
  51. while(!Q.empty()) {
  52. int u=Q.front(); Q.pop();
  53. inq[u]--;
  54. for(int i=;i<G[u].size();i++) {
  55. Edge& e=edges[G[u][i]];
  56. if(e.cap>e.flow && d[e.to]>d[u]+e.cost) {//满足可增广且可变短
  57. d[e.to]=d[u]+e.cost;
  58. p[e.to]=G[u][i];
  59. v[e.to]=min(v[u],e.cap-e.flow);
  60. if(!inq[e.to]) inq[e.to]++,Q.push(e.to);
  61. }
  62. }
  63. }
  64. if(d[t]==INF) return false;//汇点不可达则退出
  65. flow+=v[t];
  66. cost+=d[t]*v[t];
  67. int u=t;
  68. while(u!=s) {//更新正向边和反向边
  69. edges[p[u]].flow+=v[t];
  70. edges[p[u]^].flow-=v[t];
  71. u=edges[p[u]].from;
  72. }
  73. return true;
  74. }
  75.  
  76. int MincotMaxflow(int s,int t)
  77. {
  78. int flow=,cost=;
  79. while(SPFA(s,t,flow,cost));
  80. return cost;
  81. }
  82. }MM;
  83.  
  84. int main()
  85. {
  86. int _; scanf("%d",&_);
  87. while(_--) {
  88. int n,m,K,W;
  89. scanf("%d%d%d%d",&n,&m,&K,&W);
  90. MM.init(*m+);
  91. inc(i,,m) {
  92. int s,t,w,op;
  93. scanf("%d%d%d%d",&s,&t,&w,&op);
  94. node[i]={s,t,w,op};
  95. MM.AddEdge(i*,i*+,,-w);
  96. MM.AddEdge(,i*,,);
  97. MM.AddEdge(i*+,m*+,,);
  98. }
  99. inc(i,,m) inc(j,i+,m) {
  100. if(node[i].t<=node[j].s) {
  101. if(node[i].op==node[j].op)
  102. MM.AddEdge(i*+,j*,,W);
  103. else MM.AddEdge(i*+,j*,,);
  104. }
  105. if(node[j].t<=node[i].s) {
  106. if(node[i].op==node[j].op)
  107. MM.AddEdge(j*+,i*,,W);
  108. else MM.AddEdge(j*+,i*,,);
  109. }
  110. }
  111. MM.AddEdge(,,K,);
  112. int ans=MM.MincotMaxflow(,m*+);
  113. printf("%d\n",-ans);
  114. }
  115.  
  116. return ;
  117. }

hdu 6437 /// 最小费用最大流 负花费 SPFA模板的更多相关文章

  1. hdu 1533(最小费用最大流)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. hdu 4862KM&最小费用最大流

    /*最小K路径覆盖的模型,用费用流或者KM算法解决, 构造二部图,X部有N*M个节点,源点向X部每个节点连一条边, 流量1,费用0,Y部有N*M个节点,每个节点向汇点连一条边,流量1, 费用0,如果X ...

  3. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  4. HDU 1533 最小费用最大流(模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 这道题直接用了模板 题意:要构建一个二分图,家对应人,连线的权值就是最短距离,求最小费用 要注意void ...

  5. hdu 3667(最小费用最大流+拆边)

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. 最小费用最大流(luogu P3381 【模板】最小费用最大流)

    题目链接 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S. ...

  7. hdu 4067(最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4067 思路:很神奇的建图,参考大牛的: 如果人为添加t->s的边,那么图中所有顶点要满足的条件都 ...

  8. hdu 2485(最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2485 思路:题目的意思是删除最少的点使1,n的最短路大于k.将点转化为边,容量为1,费用为0,然后就是 ...

  9. hdu 6201(最小费用最大流)

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

随机推荐

  1. spring boot MVC

    1 spring boot的用途 第一,spring boot可以用来开发mvc web应用. 第二,spring boot可以用来开发rest api. 第三,spring boot也可以用来开发w ...

  2. Python中过滤HTML标签的函数

    #用正则简单过滤html的<>标签 import re str = "<img /><a>srcd</a>hello</br>&l ...

  3. 33-python基础-python3-列表插入元素-insert()方法-append()方法-extend()方法

    1-insert()方法 insert()方法可以在列表任意下标处插入一个值. insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值. 2-append()方法 调用 append( ...

  4. php被遗忘的参数 pcntl

    phpinfo () CTRL+ F–enable-pcntl今天居然可以用到.哈 狗屎运. 来自t00ls < ?php /******************************* *查 ...

  5. 将rdlc报表作为资源嵌套使用

    原文:将rdlc报表作为资源嵌套使用 如果我们准备在Windows Forms里面使用rdlc报表,那么会遇到一个问题:rdlc报表到底要不要作为附属文件的方式随程序发布? 这样做的优点是:报表可以后 ...

  6. go之linux安装

    下载地址:https://golang.org/dl/ ubuntu16.04安装过程 官方安装文档:https://golang.org/doc/install?download=go1.11.4. ...

  7. 使用JMail发送邮件

    使用JMail做最简单的文本邮件发送: 第一步.下载JMail和JAF 第二步.解压放到本地classpath中 第三步.使用: public class MailService{    privat ...

  8. CSS3中的transform转换属性

    属性 transition-property 定义对象中参与过度的属性 transition-delay 延迟 transition-duration 持续时间 transition-timing-f ...

  9. spring3+structs2整合hibernate4时报org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void sy.dao.impl.UserDaoImpl.setSessionFactory(org.hibernate.SessionFactory);

    今天在spring3+structs2整合hibernate4时报如下错误,一直找不到原因: org.springframework.beans.factory.BeanCreationExcepti ...

  10. glog 与 zlog

    1.linux 源码调用 2.log 3级 info error debug 3.调用便利性 4.配置文件 动态加载 5.输出 log 文件 (大小 时间) 6大批量写入 (100条一次写入) 7设置 ...