题目链接

把“时间粒子”作为最大流的计算结果

设置超级源点为 0

顾客点范围为 1 - 204

时间点 205 - 610

超级汇点 615

超级源点与所有顾客连线,容量为需求的烤肉数 * 需求的每块烤肉的时间(即此顾客需要占用的总时间粒子)

顾客与时间点进行连线,仅当此时间点在顾客等待的时间段内,容量为INF

每个时间点与汇点连线,容量为 m

// #include <cstdio>
// #include <cstdlib>
// #include <cmath>
// #include <cstring>
// #include <iostream>
// #include <algorithm>
// #include <string>
// #include <vector>
// #include <queue>
// #include <stack>
// #include <maps>
// #include <list>
#include <bits/stdc++.h> using namespace std; /*
* 最大流 SAP 算法,用 GAP 优化后
* 先把流量限制赋值到 maps 数组
* 然后调用 SAP 函数求解
* 可选:导出路径
*/ #define MAXN 620 int maps[MAXN][MAXN]; // 存图
int pre[MAXN]; // 记录当前点的前驱
int level[MAXN]; // 记录距离标号
int gap[MAXN]; // gap常数优化 // vector<int> roads[MAXN]; // 导出的路径(逆序)
// int curRoads; // 导出的路径数 // 入口参数vs源点,vt汇点
int SAP(int vs, int vt)
{
memset(pre, -1, sizeof(pre));
memset(level, 0, sizeof(level));
memset(gap, 0, sizeof(gap));
gap[0] = vt;
int v, u = pre[vs] = vs, maxflow = 0, aug = INT_MAX;
// curRoads = 0;
while (level[vs] < vt)
{
// 寻找可行弧
for (v = 1; v <= vt; v++)
{
if (maps[u][v] > 0 && level[u] == level[v] + 1)
{
break;
}
}
if (v <= vt)
{
pre[v] = u;
u = v;
if (v == vt)
{
// int neck = 0; // Dnic 多路增广优化,下次增广时,从瓶颈边(后面)开始
aug = INT_MAX;
// 寻找当前找到的一条路径上的最大流 (瓶颈边)
for (int i = v; i != vs; i = pre[i])
{
// roads[curRoads].push_back(i); // 导出路径——可选
if (aug > maps[pre[i]][i])
{
aug = maps[pre[i]][i];
// neck = i; // Dnic 多路增广优化,下次增广时,从瓶颈边(后面)开始
}
}
// roads[curRoads++].push_back(vs); // 导出路径——可选
maxflow += aug;
// 更新残留网络
for (int i = v; i != vs; i = pre[i])
{
maps[pre[i]][i] -= aug;
maps[i][pre[i]] += aug;
}
// 从源点开始继续搜
u = vs;
// u = neck; // Dnic 多路增广优化,下次增广时,从瓶颈边(后面)开始
}
}
else
{
// 找不到可行弧
int minlevel = vt;
// 寻找与当前点相连接的点中最小的距离标号
for (v = 1; v <= vt; v++)
{
if (maps[u][v] > 0 && minlevel > level[v])
{
minlevel = level[v];
}
}
gap[level[u]]--; // (更新gap数组)当前标号的数目减1;
if (gap[level[u]] == 0)
break; // 出现断层
level[u] = minlevel + 1;
gap[level[u]]++;
u = pre[u];
}
}
return maxflow;
}
// 超级源点 0
// 顾客点 1 - 204
// 时间点 205 - 610
// 超级汇点 615
int n, m;
const int MaxPeople = 210;
const int Ed = 615;
struct costman
{
int b, e, need, time;
};
set<int> timelist;
costman costmanlist[MaxPeople]; void init()
{
memset(maps, 0, sizeof(maps));
set<int>::iterator iterl = timelist.begin();
set<int>::iterator iterr = timelist.begin();
iterr++;
int curiter = 0;
for (size_t i = 0; i < n; i++)
{
maps[0][i + 1] = costmanlist[i].need * costmanlist[i].time;
}
while (iterr != timelist.end())
{
maps[205 + curiter][Ed] = ((*iterr) - (*iterl)) * m;
for (size_t i = 0; i < n; i++)
{
if (costmanlist[i].b <= *iterl && costmanlist[i].e >= *iterr)
{
maps[i + 1][curiter + 205] = INT_MAX;
}
}
iterl++;
iterr++;
curiter++;
}
} int main()
{
#ifdef ACM_LOCAL
freopen("./in.txt", "r", stdin);
freopen("./out.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
while (cin >> n >> m)
{
timelist.clear();
long long sum = 0;
for (size_t i = 0; i < n; i++)
{
cin >> costmanlist[i].b >> costmanlist[i].need >> costmanlist[i].e >> costmanlist[i].time;
sum += costmanlist[i].need * costmanlist[i].time;
timelist.insert(costmanlist[i].b);
timelist.insert(costmanlist[i].e);
}
init();
cout << (sum == SAP(0, Ed) ? "Yes" : "No") << endl;
}
return 0;
}

【HDU2883】kebab——最大流的更多相关文章

  1. HDU2883 kebab(最大流判断满流 + 离散化 + 区间化点)

    [题意]: 有一个烤箱,烤箱在一个时刻最多考M个肉串,N个顾客,每个顾客有属性s,n,e,t s是来的时间,n是想要的肉串数量,e是最晚离开的时间,t是烤的时间(几分熟). 顾客的烤肉可以分开烤,比如 ...

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  4. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  5. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  6. 【最大流】【HDU2883】【kebab】

    题意: 有一个烧烤机,每次最多能烤 m 块肉,现在有 n 个人来买烤肉,每个人到达时间为 si,离开时间为 ei,点的烤肉数量为 ci,点的烤肉所需烘烤时间为 di, 每个人要烤的肉可以分成若干份在同 ...

  7. HDU 2883 kebab(最大流)

    HDU 2883 kebab 题目链接 题意:有一个烧烤机,每次最多能烤 m 块肉.如今有 n 个人来买烤肉,每一个人到达时间为 si.离开时间为 ei,点的烤肉数量为 ci,每一个烤肉所需烘烤时间为 ...

  8. F - kebab HDU - 2883 (最大流构图)

    Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled on a long thin stic ...

  9. 图论--网络流--最大流 HDU 2883 kebab(离散化)

    Problem Description Almost everyone likes kebabs nowadays (Here a kebab means pieces of meat grilled ...

随机推荐

  1. (为容器分配独立IP方法二)通过虚拟IP实现docker宿主机增加对外IP接口

    虚拟IP.何为虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚IP,使用这两个IP中的任意一个都可以连接到这台主机,所有项目中数据库链接一项配 ...

  2. C++扬帆远航——11(斐波那契数列)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:Feibo.cpp * 作者:常轩 * 微信公众号:Worldh ...

  3. C++走向远洋——43(人数不定的工资类,动态分配内存与释放)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. 前端JS题

    题目如下: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function ( ...

  5. js变量提升、函数提升详解

    一.变量提升是指将变量声明提升到它所在作用域的最开始部分 console.log(a) // 为什么会出现以上的结果,是因为js的变量提升,将a变量的声明提升到全局作用域的最上面部分,实际代码如下: ...

  6. vijos 1011 清帝之惑之顺治

    背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...

  7. 整合Kafka+Flink 实例(第二部分 设计思路)

    前     言 拖了蛮久了,一直说要接着上一部分写设计思路以及代码,因为自己技术底子薄弱,加上人又懒,所以一直没能继续,今天补上设计思路及部分代码,后面有时间我会再补充一些应用性的功能,的确有些忙,希 ...

  8. linux 读取 USB HID鼠标坐标和点击 在 LCD上显示

    首先要,编译内核时启用了 USB HID 设备.启用了 鼠标 . 在开发板上插入usb 时会有如下提示. 可以看到,多了一个 mouse0 和 eventX 打出来的是我的 联想鼠标. 1, 在 终端 ...

  9. nes 红白机模拟器 第2篇 InfoNES

    InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES  的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame ()  Wo ...

  10. 手机app抓包工具,安卓手机adb无线连接

    默认手机已经usb调试配置完成 网络必须在同一网络中,每次断开wifi连接,都必须重新重做一次 使用数据线连接电脑 cmd 打开一个命令行 输入 # abd如果没有配置环境变量,请配置或者进入adb文 ...