参考和完全学习:http://www.cnblogs.com/xcantaloupe/p/9519617.html

HDU-6437

题意:

  有m场电影,电影分为两种,看一场电影可以得到对应的快乐值。有k个人,一场电影只能一个人参加,并且如果时间允许可以连续观看,但是如果连续看的电影是同一类型的,就要把快乐值减去一个w,这个w是累计的。问如何安排,可以使得k个人的快乐值最大。

思路:

  网络流问题建图真难。可以给每部电影当成一个点i,连一条从i到i+m 的边,容量为1,花费为对应的快乐值*-1,因为要求的是最大的“花费”,所以取反。再枚举点,如果时间允许,从i+m到j连一条边,若 i 和 j 类型相同,花费为w,否则为0。

这里把0点当做超级源点,m+m+1当做源点,从超级大源点到源点有k的容量,把m+m+2当做终点,就可以建图成功了。

  (参考里拿的图)

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <cctype>
#include <queue>
#include <cmath>
#include <list>
#include <map>
#include <set>
using namespace std;
//#pragma GCC optimize(3)
//#pragma comment(linker, "/STACK:102400000,102400000") //c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull; typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int ,pii> p3;
//priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFFLL; //
const ll nmos = 0x80000000LL; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3fLL; //
const double PI=acos(-1.0); template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
}
// #define _DEBUG; //*//
#ifdef _DEBUG
freopen("input", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
/*-----------------------show time----------------------*/ const int maxn = 1e5+; struct Edge
{
int to,val,cost,nxt;
}gEdge[maxn];
int gHead[maxn],gPre[maxn];
int gPath[maxn],gDist[maxn];
bool in[maxn];
int gcount = ;
int n,m,k,w; bool spfa(int s,int t){ memset(gPre, -, sizeof(gPre));
memset(gDist,inf,sizeof(gDist));
memset(in, false , sizeof(in));
gDist[s] = ; in[s] = true;
queue<int>q;
q.push(s);
while(!q.empty()){
int u = q.front();
q.pop(); in[u] = false;
for(int e = gHead[u]; e!=-; e = gEdge[e].nxt){
int v = gEdge[e].to, w = gEdge[e].cost;
if(gEdge[e].val > && gDist[v] > gDist[u] + w){
gDist[v] = gDist[u] + gEdge[e].cost;
gPre[v] = u;
gPath[v] = e;
if(!in[v]){
q.push(v);in[v] = true;
}
}
}
}
if(gPre[t] == -)return false;
return true;
}
int MinCostFlow(int s,int t){
int cost = ,flow = ;
while(spfa(s,t)){
int f = inf;
for(int u = t; u != s; u = gPre[u]){
if(gEdge[gPath[u]].val < f){
f =gEdge[gPath[u]].val;
}
}
flow += f;
cost += gDist[t] * f;
for(int u=t; u!=s; u = gPre[u]){
gEdge[gPath[u]].val -= f;
gEdge[gPath[u] ^ ].val += f;
}
}
return cost;
} void addedge(int u,int v,int val, int cost){
gEdge[gcount].to = v;
gEdge[gcount].val = val;
gEdge[gcount].cost = cost;
gEdge[gcount].nxt = gHead[u];
gHead[u] = gcount++; gEdge[gcount].to = u;
gEdge[gcount].val = ;
gEdge[gcount].cost = -cost;
gEdge[gcount].nxt = gHead[v];
gHead[v] = gcount++; } struct eee
{
int l,r,w,op;
}e[maxn];
/*
0 是大源点,m+m+1是ci源点,m+m+2是终点。
*/
void solve(){
memset(gHead,-,sizeof(gHead));
gcount = ;
scanf("%d%d%d%d", &n, &m, &k, &w);
addedge(,m+m+,k,);
for(int i=; i<=m; i++){
scanf("%d%d%d%d", &e[i].l, &e[i].r, &e[i].w, &e[i].op);
} for(int i=; i<=m; i++){
for(int j=; j<=m; j++){
if(i==j)continue; if(e[i].r <= e[j].l){
int tmp;
if(e[i].op == e[j].op)tmp = w;
else tmp = ;
addedge(i+m,j,,tmp);
}
}
} for(int i=; i<=m; i++){
addedge(i,i+m,,-e[i].w);
addedge(i+m, m+m+,,);
addedge(m+m+, i,,);
}
printf("%d\n",-*MinCostFlow(,m+m+));
}
int main(){
int T; scanf("%d", &T);
while(T--){
solve();
}
return ;
}

HDU-6437

HDU- 6437.Videos 最“大”费用流 -化区间为点的更多相关文章

  1. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  2. HDU 5644 King's Pilots 费用流

    King's Pilots 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5644 Description The military parade w ...

  3. HDU 3667 Transportation(网络流之费用流)

    题目地址:HDU 3667 这题的建图真是巧妙...为了保证流量正好达到k.须要让每一次增广到的流量都是1,这就须要把每一条边的流量都是1才行.可是每条边的流量并非1,该怎么办呢.这个时候能够拆边,反 ...

  4. HDU - 5406 CRB and Apple (费用流)

    题意:对于给定的物品,求两个在高度上单调不递增,权值上单调不递减的序列,使二者长度之和最大. 分析:可以用费用流求解,因为要求长度和最大,视作从源点出发的流量为2的费用流,建负权边,每个物品只能取一次 ...

  5. 【进阶——最小费用最大流】hdu 1533 Going Home (费用流)Pacific Northwest 2004

    题意: 给一个n*m的矩阵,其中由k个人和k个房子,给每个人匹配一个不同的房子,要求所有人走过的曼哈顿距离之和最短. 输入: 多组输入数据. 每组输入数据第一行是两个整型n, m,表示矩阵的长和宽. ...

  6. HDU 3488--Tour(KM or 费用流)

    因为每个点只能经过一次 所以考虑拆点 这题有坑,有重边.. KM算法 把一个点拆成入点和出点 入点在X部,出点在Y步. 如果u,v之间有路径,就在X部的u点连接Y部的v点 求完美匹配. 当完美匹配的时 ...

  7. hdu-6437-最大费用流

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

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

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

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

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

随机推荐

  1. 原生应用使用cordova并与h5应用分离

    个人原创地址:https://www.jianshu.com/p/1ad536e76640 1.需求与使用场景   打开一个新页面,要求能够加载本地zip格式的h5应用,该应用使用了某些原生能力:能够 ...

  2. Linux-Windows 端口转发

    在实际的生产环境中,我们为了安全性,会将一些重要的服务(数据库服务)不开放外网访问,但是当我们某个时刻由于一些特殊需求,需要进行外网访问的时候,我们可以通过端口转发来实现.通过一台和与服务可以互相访问 ...

  3. 【转载】【VSCode】Windows下VSCode编译调试c/c++

    转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Window ...

  4. Another option to bootup evidence files

    When it comes to booting up evidence files acquired from target disk, you got two options. One is VF ...

  5. python虚拟环境完美部署

    一.前言 预处理 建议仔细看完本文章之后在进行操作,避免失误,本环境可以用于生产环境,有利于生产环境python之间的环境隔离,互相不会产生环境冲突:pyenv和pyenv-virtualenv可以完 ...

  6. 堆排序(实现c++)

    堆可以看作是一个完全二叉树,分为大顶堆和小顶堆,本文我们以大顶堆为例来实现堆排序. (1)建堆 先把给定的序列转换成一棵完全二叉树,然后逐步对其调整使其每个结点的值都大于其两个子结点的值,因此我们需要 ...

  7. c# 多进程写信息到前台控件

    private void DispMsg(string strMsg, bool clearlb = false) { if (this.lberror.InvokeRequired == false ...

  8. Nunit与Xunit介绍

    Nunit安装 首先说下,nunit2.X与3.X版本需要安装不同的vs扩展. nunit2.x安装 安装如上3个,辅助创建nunit测试项目与在vs中运行单元测试用例 . 1.Nunit2 Test ...

  9. windows下通过idea连接hadoop和spark集群

    ###windows下链接hadoop集群 1.假如在linux机器上已经搭建好hadoop集群 2.在windows上把hadoop的压缩包解压到一个没有空格的目录下,比如是D盘根目录 3.配置环境 ...

  10. 多线程之NSThread

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD一, ...