题意:给你N个的任务一定要在每天的[Li,Ri]时段完成,然后你只有K天的时间,每个任务有个val,然后求K天里能够获得的最大bonus。

思路:拿到手第一直觉是最小费用最大流,然后不会建图,就跑去想dp去了。好吧最小费用最大流的做法是这样的。首先题目给的是时间,所以变成整数的区间再离散化是一个标准姿势啦。然后对于相邻的时间点 1,2,3,4顺次建立这样的边 1->2->3->4...,边的容量为inf,费用为0.然后对于源点s,我们向时间点1连一条容量为k,费用为0的边,目的是限流。最后由最后一个时间点向汇点t连一条容量为inf,费用为0的边。然后对于每个事件,li,ri,vi,由时间点li->ri连容量为1费用为-vi的边。跑一遍最大流就可以了,最后的答案取个相反数(因为这里其实是最大费用最大流)。考虑一下正确性,首先一定是可以满流的,然后对于每条流出的流量,它只能往右走不能往左走,保证了区间不相交,所以最后跑出来的就是答案。

#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
#define maxn 10000
#define maxe 30000
#define inf 0x3f3f3f3f
using namespace std; struct Edge{
int u, v, nxt, cap, cost;
}edge[maxe];
int head[maxn]; int n, m;
int k;
int siz; struct MinCostMaxFlow
{
queue<int> que;
int add; // edges number
int vn; // total vertex number
int cost[maxn], in[maxn], pre[maxn];
bool vis[maxn];
void init(){
add = 0; vn = siz + 10; memset(head, -1, sizeof(head));
while (!que.empty()) que.pop();
}
void insert(int u, int v, int w, int c){
edge[add].u = u; edge[add].v = v; edge[add].cap = w; edge[add].cost = c;
edge[add].nxt = head[u]; head[u] = add++;
edge[add].u = v; edge[add].v = u; edge[add].cap = 0; edge[add].cost = -c;
edge[add].nxt = head[v]; head[v] = add++;
} bool spfa(int s, int e){
memset(cost, 0x3f3f3f3f, sizeof(cost));
memset(in, 0, sizeof(in));
memset(vis, 0, sizeof(vis));
cost[s] = 0; pre[s] = -1;
que.push(s); vis[s] = true; in[s]++;
while (!que.empty()){
int u = que.front(); que.pop();
vis[u] = false;
for (int i = head[u]; i != -1; i = edge[i].nxt){
int v = edge[i].v;
if (edge[i].cap > 0 && cost[v] > cost[u] + edge[i].cost){
cost[v] = cost[u] + edge[i].cost; pre[v] = i;
if (!vis[v]){
que.push(v); vis[v] = true; in[v]++;
if (in[v] > vn) return false;
}
}
}
}
if (cost[e] < inf) return true;
else return false;
}
int mincostmaxflow(int s, int e){
int mincost = 0, maxflow = 0;
while (spfa(s, e)){
int flow = inf;
for (int i = pre[e]; i != -1; i = pre[edge[i].u]){
flow = min(flow, edge[i].cap);
}
maxflow += flow;
for (int i = pre[e]; i != -1; i = pre[edge[i].u]){
edge[i].cap -= flow;
edge[i ^ 1].cap += flow;
}
mincost += cost[e] * flow;
}
return mincost;
}
}net; struct Seg
{
int l, r;
int val;
}seg[maxn]; int dis[maxn]; int top; int main()
{
while (cin >> n >> k){
int hi, mi, si;
top = 0;
for (int i = 0; i < n; i++){
scanf("%d:%d:%d", &hi, &mi, &si);
seg[i].l = hi * 60*60 + mi * 60 + si;
dis[top++] = seg[i].l;
scanf("%d:%d:%d", &hi, &mi, &si);
seg[i].r = hi * 60*60 + mi * 60 + si;
dis[top++] = seg[i].r;
scanf("%d", &seg[i].val);
}
sort(dis, dis + top);
siz = unique(dis, dis + top) - dis;
for (int i = 0; i < n; i++){
seg[i].l = lower_bound(dis, dis + siz, seg[i].l) - dis + 1;
seg[i].r = lower_bound(dis, dis + siz, seg[i].r) - dis + 1;
}
net.init();
int s = siz + 1, t = s + 1;
for (int i = 1; i <= siz - 1; i++) net.insert(i, i + 1, inf, 0);
net.insert(s, 1, k, 0);
net.insert(siz, t, inf, 0);
for (int i = 0; i < n; i++){
net.insert(seg[i].l, seg[i].r, 1, -seg[i].val);
}
cout << -net.mincostmaxflow(s, t) << endl;
}
return 0;
}

ZOJ3762 The Bonus Salary!(最小费用最大流)的更多相关文章

  1. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  2. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...

  3. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  4. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  5. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  6. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

  7. hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***

    题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙,          每个逮捕队伍在每个城市可以选 ...

  8. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

  9. UVa12092 Paint the Roads(最小费用最大流)

    题目大概说一个n个点m条带权有向边的图,要给边染色,染色的边形成若干个回路且每个点都恰好属于其中k个回路.问最少要染多少边权和的路. 一个回路里面各个点的入度=出度=1,那么可以猜想知道各个点如果都恰 ...

随机推荐

  1. FineUI PK DWZ

    一.概述 FineUI(ExtAspNet)是基于 jQuery / ExtJS 的 ASP.NET 控件库. DWZ是基于JQuery的一个客户端框架. 二.比较 三.总结 这两个东西实质都是对控件 ...

  2. expdp与impdp

    参考http://blog.csdn.net/hello985/article/details/13295305 (一)        导出scott用户下的emp表到xx用户下 1.1      创 ...

  3. swift学习(二)--基本运算符、字符串、集合操作

    在这一篇博客里面,我想要介绍一下swift里面一些常用的基本运算符,还有涉及到的字符串,集合操作.你会发现在swift里面还是有许多其他语言所不具有的特性运算操作的. 首先最基本的+,-,*,/,&g ...

  4. IOS内存管理「1」- 引用计数

  5. PHP闭包(Closure)初探

    不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后.在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣. 于是乎 ...

  6. [超简洁]EasyQ框架-应对WEB高并发业务(秒杀、抽奖)等业务

    背景介绍 这几年一直在摸索一种框架,足够简单,又能应付很多高并发高性能的需求.研究过一些框架思想如DDD DCI,也实践过CQRS框架. 但是总觉得复杂度高,门槛也高,自己学都吃力,如果团队新人更难接 ...

  7. [转]分布式文件系统FastDFS架构剖析

    [转]分布式文件系统FastDFS架构剖析 http://www.programmer.com.cn/4380/ 文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实 ...

  8. Altera USB Blaster 仿真器(EPM240仿制版

    转载:http://tigerwang202.blogbus.com/logs/35981280.html 其他很好的资料:http://bbs.ednchina.com/BLOG_ARTICLE_1 ...

  9. PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...

  10. java版大数相乘

    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用j ...