题目大意:

给定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个人

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

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

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int N=;
const int mod=1e9+; int n,m;
struct NODE { int s,t,w,op; }node[];
struct Edge
{
int from,to,cap,flow,cost;
Edge(int u,int v,int ca,int f,int co):from(u),to(v),cap(ca),flow(f),cost(co){};
}; struct MCMF
{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[N];
int inq[N];//是否在队列中
int d[N];//距离
int p[N];//上一条弧
int v[N];//可改进量 void init(int n) //初始化 顶点为 0~n-1
{
this->n=n;
for(int i=;i<=n;i++) G[i].clear();
edges.clear();
} void AddEdge(int from,int to,int cap,int cost)//加边
{
edges.push_back(Edge(from,to,cap,,cost));
edges.push_back(Edge(to,from,,,-cost));
int m=edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool SPFA(int s,int t,int &flow,int &cost)//寻找最小费用的增广路,使用引用同时修改原flow,cost
{
for(int i=;i<n;i++) d[i]=INF;
memset(inq,,sizeof(inq));
d[s]=;inq[s]=;p[s]=;v[s]=INF;
queue<int>Q; Q.push(s);
while(!Q.empty()) {
int u=Q.front(); Q.pop();
inq[u]--;
for(int i=;i<G[u].size();i++) {
Edge& e=edges[G[u][i]];
if(e.cap>e.flow && d[e.to]>d[u]+e.cost) {//满足可增广且可变短
d[e.to]=d[u]+e.cost;
p[e.to]=G[u][i];
v[e.to]=min(v[u],e.cap-e.flow);
if(!inq[e.to]) inq[e.to]++,Q.push(e.to);
}
}
}
if(d[t]==INF) return false;//汇点不可达则退出
flow+=v[t];
cost+=d[t]*v[t];
int u=t;
while(u!=s) {//更新正向边和反向边
edges[p[u]].flow+=v[t];
edges[p[u]^].flow-=v[t];
u=edges[p[u]].from;
}
return true;
} int MincotMaxflow(int s,int t)
{
int flow=,cost=;
while(SPFA(s,t,flow,cost));
return cost;
}
}MM; int main()
{
int _; scanf("%d",&_);
while(_--) {
int n,m,K,W;
scanf("%d%d%d%d",&n,&m,&K,&W);
MM.init(*m+);
inc(i,,m) {
int s,t,w,op;
scanf("%d%d%d%d",&s,&t,&w,&op);
node[i]={s,t,w,op};
MM.AddEdge(i*,i*+,,-w);
MM.AddEdge(,i*,,);
MM.AddEdge(i*+,m*+,,);
}
inc(i,,m) inc(j,i+,m) {
if(node[i].t<=node[j].s) {
if(node[i].op==node[j].op)
MM.AddEdge(i*+,j*,,W);
else MM.AddEdge(i*+,j*,,);
}
if(node[j].t<=node[i].s) {
if(node[i].op==node[j].op)
MM.AddEdge(j*+,i*,,W);
else MM.AddEdge(j*+,i*,,);
}
}
MM.AddEdge(,,K,);
int ans=MM.MincotMaxflow(,m*+);
printf("%d\n",-ans);
} return ;
}

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. 数据库(一)—— MySQL介绍

    目录 MySQL介绍 一.MySQL版本 1.mysql主流版本 2.版本选择 二.MySQL连接与实例 1.MySQL的C/S结构 2.MySQL实例 三.mysql三层结构 1.连接层(连接上数据 ...

  2. Java泛型方法和构造函数

    可以在方法声明中定义类型参数,它们在方法的返回类型之前的尖括号中指定.包含泛型方法声明的类型不必是通用类型.可以在非静态方法声明中使用为泛型类型指定的类型参数. 示例 以下代码显示如何为方法m1()定 ...

  3. Cococs2d-x学习路线

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Cocos2D-X推荐书: Cocos2d-x权威指南

  4. 2059-authentication plugin 'caching_sha2_password"cnnot bt loaded :mysql8.0数据库连接不上(Navicat)

    原因:8.0改变了 身份验证插件 , 打开 my.ini (或者my.cofg) 可以看到变更了 5.7及其以前的方式:mysql_native_password 办法: 1:命令行键入数据库: my ...

  5. nodeType介绍及应用示例

    一,DOM中的节点类型介绍 DOM将一份文档抽象为一棵树,而树又由众多不同类型的节点构成. 元素节点是DOM中的最小单位节点,它包括了各种标签,比如表示段落的p,表示无序列表的ul等. 文本节点总是被 ...

  6. Pytest参数传递

    import pytest@pytest.fixture()def login_r(open_browser):#调用login时,发现需要先打开浏览器,所以改成先打开浏览器,在登陆 print('输 ...

  7. 【总】IdentityServer4 32篇汇总

    随笔分类 - IdentityServer4 IdentityServer4 常见问题 - 用户拒绝授权后报错 摘要: 1.问题说明 在 IdentityServer4 Web 授权中,一般会有一个显 ...

  8. Go 语言变量、常量

    变量 第一种,指定变量类型,声明后若不赋值,使用默认值. var v_name v_type v_name = value 第二种,根据值自行判定变量类型. var v_name = value 第三 ...

  9. springboot集成redis报错-ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig

    当使用Springboot 2.0以上版本集成redis的时候遇到报错信息如下: Application run failed org.springframework.beans.factory.Un ...

  10. Codeforces 1169E DP

    题意:给你一个长度为n的序列,有q次询问,每次询问给出两个位置x和y(x < y),问是否可从x到达y?可达的定义是:如果存在一个序列(假设长度为k),其中p1 = x, pk = y,并且这个 ...