uvalive5843(最大流)
转载自:http://vawait.com/uvalive-5843/
题意:
给出n个工人,给出m个命令,每条命令给出这条命令的最早开始时间、最晚结束时间和完成这条命令所需要的时间,求出一种方案使得完成时间最早。
思路:
源点到每个工作添加流为工作时间,从工作到每个时间点添加流为1,从每个时间点到汇点添加流为工人数目。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define red(i, a, b) for (int i = (a); i >= (b); --i)
#define clr( x , y ) memset(x,y,sizeof(x))
#define sqr(x) ((x) * (x))
#define mp make_pair
#define pb push_back
typedef long long lint;
int t , n , m , sum , s[110] , d[110] , w[110];
bool v[110][510];
int a[750] , vh[750] , h[750];struct nodd
{int y , d , n;
} b[300000];void add(int x,int y,int d)
{b[++t].y = y; b[t].d = d;b[t].n = a[x]; a[x] = t;b[++t].y = x; b[t].d = 0;b[t].n = a[y]; a[y] = t;
}int sap(int t,int d)
{int minh = 650 , max = d , x , y;if ( t == 610 ) return d;for ( int p = a[t]; p; p = b[p].n ) if ( b[p].d ) {y = b[p].y;if ( h[y] + 1 == h[t] ) {x = sap( y , max > b[p].d ? b[p].d : max );b[p].d -= x; b[ p ^ 1 ].d += x;max -= x; if ( !max || h[0] > 650 ) return d - max;}if ( h[y] < minh ) minh = h[y];}if ( max == d ) {if ( !( -- vh[h[t]] ) ) h[0] = 660;vh[ h[t] = minh + 1 ] ++;}return d - max;
}void init()
{scanf("%d%d",&n,&m);rep(i,1,m) scanf("%d%d%d",&s[i],&w[i],&d[i]);clr( v , 0 );clr( a , 0 );clr( h , 0 );clr( vh , 0 ); vh[0] = 700;sum = 0; t = 1;rep(i,1,m) sum += w[i];rep(i,1,m)rep(j,s[i],d[i]-1) add( i + 500 , j , 1 );rep(i,1,m) add( 0 , i + 500 , w[i] );rep(i,1,500) add( i , 610 , n );
}void work()
{while ( h[0] < 610 ) sum -= sap( 0 , 10000000 );if ( sum ) {puts("0");return;}rep(i,1,m)for ( int p = a[i+500]; p ; p = b[p].n ) if ( !b[p].d ) v[i][b[p].y] = 1;vector < int > g[110];rep(i,1,m) {rep(j,1,500) if ( v[i][j] && !v[i][j-1] ) {int x = j + 1;while ( v[i][x] ) x ++;g[i].pb( j );g[i].pb( x );}}rep(i,1,m) {int x = g[i].size();printf("%d",x/2);rep(j,0,x-1) printf(" %d",g[i][j]);puts("");}
}int main()
{int t;cin >> t;while ( t -- ) {init();work();}return 0;
}
uvalive5843(最大流)相关推荐
- stream流对象的理解及使用
我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...
- 如何判断飞机的年限_技术流带你鉴定前风挡玻璃更换,不再使用日期判断!
这又是一篇关于前风挡玻璃鉴定的文章,我记得在二手车鉴定微信公众号里面已经发布好几篇这样的文章了,当然每篇文章的住重点不同,今天这一篇应该是完结篇,它们在一起能组成一套玻璃更换系列专题课程: 我们回 ...
- SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断
什么是Sentinel? 请查看文章:SpringCloud Alibaba微服务实战(一) - 基础环境搭建 构建服务消费者cloud-sentinel进行服务调用 服务创建请查看文章:Spring ...
- 文件流处理流式处理大数据处理
20210315 https://www.yuque.com/7125messi/wydusr/wweetn 42-(重要重要重要)加速pandas(Modin和pandarallel) 重点 htt ...
- javaSE8的流库总结
前言 本篇博客对 java 8 的流库进行一个总结 1. 从迭代到流 在处理集合时,我们通常会迭代遍历它的元素,并在每个元素上执行某项操作,列如假设我们想统计某本书的所有长单词数(单词长度大于10): ...
- CUDA 7流简化并发
CUDA 7流简化并发 异构计算是指有效使用系统中的所有处理器,包括CPU和GPU.为此,应用程序必须在多个处理器上同时执行功能.CUDA应用程序通过在流(按顺序执行的命令序列)中,执行异步命令来管理 ...
- GPU编程和流式多处理器(二)
GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. • 加法运算符的可选否定加法 • 乘法与乘法加法 • 整数除法 • 逻辑运算 • 条件码操作 • to/from浮点 ...
- GPU编程和流式多处理器
GPU编程和流式多处理器 流式多处理器(SM)是运行CUDA内核的GPU的一部分.本章重点介绍SM的指令集功能. 流式多处理器(SM)是运行我们的CUDA内核的GPU的一部分.每个SM包含以下内容. ...
- Cuda Stream流 分析
Cuda Stream流分析 Stream 一般来说,cuda c并行性表现在下面两个层面上: • Kernel level • Grid level Stream和event简介 Cuda stre ...
最新文章
- DNA测序,第一代DNA测序,第二代DNA测序,第三代DNA测序,sanger法
- CMD用什么命令可以删除服务?
- adb查看某个文件是否存在_动能定理是否存在某个方向的分量方程式?
- 用非递归方式实现二叉树后序遍历
- 超好的Git学习网站
- php面试题接口方面,php面试题6 - osc_xb4v1nhl的个人空间 - OSCHINA - 中文开源技术交流社区...
- python如何写二进制乘法_使用python写乘法口诀表
- 2019 CCF 推荐 会议 列表
- Intellij idea 插件 | 超越鼓励师 吐槽
- Tinder活号技术在YouTube上面居然有用模拟器和浏览器玩明白了使用谷歌下载的
- 旅游吧!我在这里—旅游相册POI搜索:找回你的足迹
- python银行账户资金交易管理_Python实现银行账户资金交易管理系统
- 我们为什么要学习保险知识
- mxGraph Web在线绘图
- 项目 | Java+PhantomJs爬虫实战——半次元 下载高清原图
- 《辛雷学习方法》读书笔记——第二章 心态
- weka中的arff格式数据
- sql2005数据完整性之约束和规则
- 137.菜单悬停放大特效
- 看涨期权和看跌期权的图解