HDU2883_kebab
很好的题目。
有不多于200个任务,每个任务要在si到ei这个时间段内完成,每个任务的任务量是ti*ni,只有一台机器,且其单位时间内可完成的任务量为m。
现在问你,能否使所有的任务全部在规定的时间段内完成。
首先把所有的时间都提取出来,排序,得到2*n-1个时间区间。
网络流建模。首先创建一个超级源点和超级汇点。源点连接n个任务,与每个任务的边的容量为ni*ti,汇点连接2*n-1个时间区间,容量为时间长度与m的乘积。同时在任务和时间区间之间也需要连边,如果某个任务的时间和时间区间有公共时间段,那么他们之间连一条边,边容量为公共时间长度乘以m。这样我们只需要求整个网络的最大流,看看是否与总的工作量相等即可。
很有意思。嘿嘿
召唤代码君:
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#define maxn 777
#define Inf ~0U>>1
using namespace std; int c[maxn][maxn],d[maxn],can[maxn];
int n,m,s,t,tot,ans;
int ni[maxn],ti[maxn],si[maxn],ei[maxn];
int T[maxn],N;
vector<int> v[maxn]; void _init()
{
s=1,t=1+3*n,N=0,ans=tot=0;
for (int i=1; i<=1+3*n; i++)
{
v[i].clear();
for (int j=1; j<=1+3*n; j++) c[i][j]=0;
}
} void graph_build()
{
int L,R;
sort(T+1,T+1+2*n);
for (int i=1; i<=n; i++)
{
c[1][i+1]=ni[i]*ti[i];
v[1].push_back(i+1),v[i+1].push_back(1);
}
for (int i=1; i<2*n; i++)
{
c[n+1+i][3*n+1]=(T[i+1]-T[i])*m;
v[n+1+i].push_back(3*n+1),v[3*n+1].push_back(n+1+i);
}
for (int i=1; i<=n; i++)
for (int j=1; j<2*n; j++)
{
L=max(si[i],T[j]);
R=min(ei[i],T[j+1]);
if (L>=R) continue;
c[1+i][n+1+j]=(R-L)*m;
v[1+i].push_back(n+1+j),v[n+1+j].push_back(1+i);
}
} void bfs()
{
for (int i=s; i<=t; i++) d[i]=999999,can[i]=0;
queue<int> Q;
Q.push(t);
d[t]=0;
while (!Q.empty())
{
int cur=Q.front();
Q.pop();
for (unsigned i=0; i<v[cur].size(); i++)
{
if (c[v[cur][i]][cur]<=0) continue;
if (d[cur]+1<d[v[cur][i]])
{
d[v[cur][i]]=d[cur]+1;
Q.push(v[cur][i]);
}
}
}
} int dfs(int cur,int num)
{
if (cur==t) return num;
int k,tmp=num;
for (unsigned i=0; i<v[cur].size(); i++)
{
if (c[cur][v[cur][i]]<=0 || d[v[cur][i]]+1!=d[cur] || can[v[cur][i]]) continue;
k=dfs(v[cur][i],min(num,c[cur][v[cur][i]]));
if (k) c[cur][v[cur][i]]-=k,c[v[cur][i]][cur]+=k,num-=k;
}
if (num) can[cur]=1;
return tmp-num;
} int Dinic()
{
for (bfs(); d[s]<3*n+1; bfs()) ans+=dfs(1,Inf);
return ans;
} int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
_init();
for (int i=1; i<=n; i++)
{
scanf("%d%d%d%d",&si[i],&ni[i],&ei[i],&ti[i]);
tot+=ni[i]*ti[i];
T[++N]=si[i],T[++N]=ei[i];
}
graph_build();
if (Dinic()==tot) puts("Yes");
else puts("No");
}
return 0;
}
HDU2883_kebab的更多相关文章
随机推荐
- python中偏函数的应用
一.什么是偏函数? (1)在Python的functools模块众多的功能中,其中有一个就是偏函数,我们称之为 partial function 模块的概念我们下一篇在细讲. (2)我们都听过偏将军吧 ...
- python基础—字典
阅读文本需要3分钟,不建议跳读 节目清单 字典是python中最重要的数据类型,字典由“键-值”对组成的集合,字典中的“值”通过“键”来引用.这里将介绍字典的定义.访问.排序等功能. 字典的创建 字典 ...
- Flutter - Stateful(有状态) 和 stateless(无状态) widgets
Stateful(有状态) 和 stateless(无状态) widgets 有些widgets是有状态的, 有些是无状态的 如果用户与widget交互,widget会发生变化,那么它就是有状态的. ...
- Web开发框架趋势
Node.js增长很快,已经冒尖了 ASP.NET MVC 发展平稳(平稳很重要) Spring MVC沾着Spring的光,渐渐超越了Struts 2 Struts作为一个整体(Struts 1 和 ...
- 写个hello world了解Rxjava
目录 什么是Rxjava? 在微服务中的优点 上手使用 引入依赖 浅谈分析Rxjava中的被观察者,观察者 spring boot 项目中使用Rxjava2 什么是Rxjava? 来自百度百科的解释 ...
- svn图文教程-宋正河整理
下载地址:http://download.csdn.net/download/songzhengdong82/4433476 在线浏览:http://wenku.baidu.com/view/07f1 ...
- Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(二)
本文接上一节是测试部分 搭建一个模拟测试环境 作者将fabric release1.2工程中的 example-e2e进行了改造来进行本次实验: (1)首先我们将examples/e2e_cli/sc ...
- i++ i+=1 i=i+1 汇编代码效率比较
结论:一样.编译器和编译器之间可能有点区别但是程序不会变. 0x00 一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或 ...
- 结对编程-->总结报告
项目github地址 PSP时间表格 结对编程中关于Information Hiding, Interface Design, Loose Coupling原则的使用 Information Hidi ...
- Hibernate笔记③--集合映射、组合映射、联合主键、查询案例
lazy 懒加载 默认为proxy 继承映射 discriminant column="type" type="string" 集合映射 生成表的语句: ...