UVALive - 6571 It Can Be Arranged 最大流
题目链接:
http://acm.hust.edu.cn/vjudge/problem/48415
It Can Be Arranged
Time Limit: 3000MS
#### 问题描述
> Every year, several universities arrange inter-university national programming contests. ACM ICPC
> Dhaka site regional competition is held every year in Dhaka and one or two teams are chosen for ACM
> ICPC World Finals.
> By observing these, MMR (Mission Maker Rahman) has made a plan to open a programming
> school. In that school, N courses are taught. Each course is taught every day (otherwise, programmers
> may forget DP while learning computational geometry!). You will be given the starting time Ai and
> finishing time Bi (inclusive) of each course i (1 ≤ i ≤ N). You will be also given the number of students
> registered for each course, Si (1 ≤ i ≤ N). You can safely assume no student has registered to two
> different courses. MMR wants to hire some rooms of a building, named Sentinel Tower, for running that
> school. Each room of Sentinel Tower has a capacity to hold as much as M students. The programmers
> (students) are very restless and a little bit filthy! As a result, when coursei
> is taken in a class room,
> after the class is finished, it takes cleanij time to clean the room to make it tidy for starting teaching
> coursej immediately just after coursei in the same room.
> Your job is to help MMR to decide the minimum number of rooms need to be hired to run the
> programming school.
#### 输入
> Input starts with an integer T (T ≤ 100) denoting the number of test cases. Each case starts with two
> integers N (1 ≤ N ≤ 100), number of courses and M (1 ≤ M ≤ 10000), capacity of a room. Next N
> lines will contain three integers Ai
> , Bi (0 ≤ Ai ≤ Bi ≤ 10000000) and Si (1 ≤ Si ≤ 10000), starting
> and finishing time of a course. Next N lines will contain the clean time matrix, where the i-th row will
> contain N integers cleanij (1 ≤ i ≤ N, 1 ≤ j ≤ N, 0 ≤ cleanij ≤ 10000000, cleanii = 0).
#### 输出
> For each case, print the test case number, starting from 1, and the answer, minimum number of rooms
> needed to be hired.
样例
sample input
3
1 5
1 60 12
0
4 1
1 100 10
50 130 3
150 200 15
80 170 7
0 2 3 4
5 0 7 8
9 10 0 12
13 14 15 0
2 1
1 10 1
12 20 1
0 2
5 0sample output
Case 1: 3
Case 2: 22
Case 3: 2
题意
现在需要上n个课程,每个课程:(s,t,p),描述开始时间,结束时间,和上课人数。
现在有若干个最多能容纳m个人的教室,问如何用最少的教室上完所有的课。
题解
如果教室的容量没有要求,那么这将是一个经典的DAG的最少路径覆盖问题。
加了教室容量限制之后,变成了一个带权的最少路径覆盖问题。
我们可以这样建图:首先拆点,把课程i拆成i,i+n,0到i连边,i+n到2*n+1连边,边权为i课程需要的教室数,然后如果课程i上完能够接着上j,那么就连一条边权为INF的边从i到j+n。 然后跑最大流,这样跑出了的值相当于能够共用的教室数,吧总数-最大流就是答案了。
代码
#include<map>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define M (l+(r-l)/2)
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
typedef long long LL;
const int maxn=444;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const int mod=1e9+7;
struct Edge {
int from,to,cap,flow;
Edge(int f,int t,int c,int fl):from(f),to(t),cap(c),flow(fl) {}
};
struct Dinic {
int n,m,s,t;
vector<Edge> egs;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
void init(int n) {
this->n=n;
for(int i=0; i<=n; i++) G[i].clear();
egs.clear();
}
void addEdge(int from,int to,int cap) {
egs.push_back(Edge(from,to,cap,0));
egs.push_back(Edge(to,from,0,0));
m=egs.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
bool BFS() {
memset(vis,0,sizeof(vis));
queue<int> Q;
Q.push(s);
d[s]=0;
vis[s]=1;
while(!Q.empty()) {
int x=Q.front();
Q.pop();
for(int i=0; i<G[x].size(); i++) {
Edge& e=egs[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow) {
vis[e.to]=1;
d[e.to]=d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x,int a) {
if(x==t||a==0) return a;
int flow=0,f;
for(int& i=cur[x]; i<G[x].size(); i++) {
Edge& e=egs[G[x][i]];
if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0) {
e.flow+=f;
egs[G[x][i]^1].flow-=f;
flow+=f;
a-=f;
if(a==0) break;
}
}
return flow;
}
int Maxflow(int s,int t) {
this->s=s;
this->t=t;
int flow=0;
while(BFS()) {
memset(cur,0,sizeof(cur));
flow+=DFS(s,INF);
}
return flow;
}
} dinic;
int n,m;
LL si[maxn],ti[maxn],C[maxn][maxn];
int wi[maxn];
void init() {
dinic.init(2*n+2);
}
int main() {
int tc,kase=0;
scanf("%d",&tc);
while(tc--) {
scanf("%d%d",&n,&m);
init();
for(int i=1; i<=n; i++) {
scanf("%lld%lld%d",&si[i],&ti[i],&wi[i]);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
scanf("%lld",&C[i][j]);
}
}
int sum=0;
for(int i=1; i<=n; i++) {
int cap=wi[i]%m?wi[i]/m+1:wi[i]/m;
sum+=cap;
dinic.addEdge(0,i,cap);
dinic.addEdge(i+n,2*n+1,cap);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(ti[i]+C[i][j]<si[j]) {
dinic.addEdge(i,j+n,INF);
}
}
}
int ans=dinic.Maxflow(0,2*n+1);
printf("Case %d: %d\n",++kase,sum-ans);
}
return 0;
}
UVALive - 6571 It Can Be Arranged 最大流的更多相关文章
- 【Uvalive 2531】 The K-League (最大流-类似公平分配问题)
[题意] 有n个队伍进行比赛,每场比赛,恰好有一支队伍取胜.一支队伍败.每个队伍需要打的比赛场数相同,给你每个队伍目前已经赢得场数和输得场数,再给你一个矩阵,第 i 行第 j 列 表示队伍 i 和队伍 ...
- POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)
POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...
- uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。
/** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...
- UVALive - 6266 Admiral 费用流
UVALive - 6266 Admiral 题意:找两条完全不相交不重复的路使得权值和最小. 思路:比赛的时候时间都卡在D题了,没有仔细的想这题,其实还是很简单的,将每个点拆开,连一条容量为1,费用 ...
- UVALive 6887 Book Club 最大流解最大匹配
题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- Uvalive 4865 Data Recovery 最大流
题意就是 给一个50 * 50的矩阵 然后给出每行每列元素的和 和一个初始矩阵 矩阵中有些是未知,有些是已知 然后我们求目标矩阵就是把能确定的元素的值求出来,实在不能确定的就置为-1 所有矩阵元素的值 ...
- UVALive 3645 Objective: Berlin(最大流 :时序模型)
题意:已知n(n <= 150)个城市和m(m <= 5000)个航班,每个航班有出发地.到达地.乘坐人数.起飞时间和降落时间(时间用时和分表示),求从一个指定城市出发,去往另一个指定城市 ...
- 【 UVALive - 2197】Paint the Roads(上下界费用流)
Description In a country there are n cities connected by m one way roads. You can paint any of these ...
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
随机推荐
- JqueryMobile动态生成listView并实现刷新的两种方法
本篇文章主要是对JqueryMobile动态生成listView并实现刷新的两种方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JqueryMobile动态生成listView并实现刷新 ...
- 转:OpenCms 9.0.1汉化
LHD私人汉化. 1.完成安装OpenCms 2.如果正确安装,在浏览器输入以下地址即可打开登录页面(默认账号/密码:Admin/admin) http://localhost:8080/opencm ...
- JavaScript模块化---AMD规范
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...
- VS2008调试快捷键
F5: 启动调试 Ctrl+F5: 开始执行(不调试) F10: 逐过程(不进入函数单步) F11: 逐语句(进入函数单步) Shift+F11跳出(实用) Ctrl+F10: 运行到光标处 F6: ...
- NSDateFormatter中时间格式串的含义
a: AM/PM (上午/下午) A: 0~86399999 (一天的第A微秒) c/cc: 1~7 (一周的第一天, 周天为1) ccc: Sun/Mon/Tue/Wed/Thu/Fri/Sat ( ...
- Ajax的利弊
ajax的优点 1.最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好. 2.使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力. 3.可以把以前一些服务器负担的工 ...
- c语言学习的第四天2
上图显示了float和double的精度,精度:就是指数值的精确程度,浮点类型可表示的数值范围很大,但只有几位是精确的,可以通过小 数所占的位数来获取,float小数部分最多能有7位有效数字,但绝对能 ...
- php教程一,变量
php是一种动态脚本语言,比较适合web开发. php支持8种变量数据类型: 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string ...
- iOS中使用子线程的完整方法
http://www.cnblogs.com/ygm900/archive/2013/06/23/3151691.html 第一步:开启子线程 //开启子线程到网络上获取数据 myFirstThrea ...
- 从基础开始,从一个SQLHelper开始
最开始考虑的问题有这三点: 1.Access和SQLServer都要能用. 2.尽量简单,清晰. 3.性能不出大问题. public class SQLHelp { #region 私有域 priva ...