UVALive6571 It Can Be Arranged(最小路径覆盖)
题意:现在有n个课程,每个课程有一定的参与人数,然后每个课程有开始时间和结束时间ai,bi.
而且给定了一个矩阵clean(ij),表示的是上完i课程需要clean[i][j]的时间打扫卫生才能继续上j课程。也就是说如果上完i课程要上j课程就需要满足条件
b[i]+clean[i][j]<a[j]. 然后每间课室能容纳一定的人数(如果课室30个人,课程有61个人的话,就需要三间教室),问最少要用多少间课室安排全部的课程。
看完题后觉得是网络流,然后想了一下跟大白上讲得一道题很像,就是一个最小路径覆盖,不过这题是带权的。不停地回忆建图方法,但就是想不起来,后来找了师弟借了大白看了一下才想起建模的方法。
对于每个课程i我们建两个点i和i'.如果上完i课程来得及上j课程的话,就i->j'. 然后源点向所以的i点连一条边,容量就是对应的需要开的课室数,然后所有i'点向汇点连边,对应的容量也是需要开的课室数。
最后跑一次最大流,答案就是总的课室数-最大流。原因就是每一条流出去的边看成是重用了已有的课室,每一条流出去的边就相当于节省了多少间课室。过了题说明我的Dicnic模板还是可以用的,不过还是找时间补个SAP- -0
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
#include <map>
#include <vector>
#include <string>
using namespace std; #define maxn 300
#define maxe 200000
#define inf 0x3f3f3f3f struct Edge
{
int u,v,cap;
int nxt;
}edge[maxe]; int head[maxn];
int n,m;
int a[maxn],b[maxn],s[maxn];
int mat[maxn][maxn]; struct Dicnic
{
int level[maxn];
int iter[maxn];
int add;
void init()
{
add=0;memset(head,-1,sizeof(head));
memset(iter,-1,sizeof(iter));
}
void insert(int u,int v,int c)
{
edge[add].u=u;edge[add].v=v;
edge[add].cap=c;
edge[add].nxt=head[u];head[u]=add++; edge[add].u=v;edge[add].v=u;
edge[add].cap=0;
edge[add].nxt=head[v];head[v]=add++;
} void bfs(int s){
memset(level,-1,sizeof(level));
queue<int> que;
level[s]=0;
que.push(s);
while(!que.empty()){
int v=que.front();que.pop();
for(int i=head[v];i!=-1;i=edge[i].nxt){
Edge &e=edge[i];
if(e.cap>0&&level[e.v]<0){
level[e.v]=level[v]+1;
que.push(e.v);
}
}
}
} int dfs(int v,int t,int f){
if(v==t) return f;
for(int &i=iter[v];i!=-1;i=edge[i].nxt){
Edge &e=edge[i];Edge &reve=edge[i^1];
if(e.cap>0&&level[v]<level[e.v]){
int d=dfs(e.v,t,min(f,e.cap));
if(d>0){
e.cap-=d;reve.cap+=d;
return d;
}
}
}
return 0;
} int max_flow(int s,int t){
int flow=0;
for(;;){
bfs(s);
if(level[t]<0) return flow;
memcpy(iter,head,sizeof(iter));
int f;
while((f=dfs(s,t,inf))>0){
flow+=f;
}
}
}
}net; int main()
{
int T;cin>>T;int ca=0;
while(T--)
{
int tot=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d%d",a+i,b+i,s+i);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&mat[i][j]);
}
}
net.init();
int ss=0,t=2*n+1;
for(int i=1;i<=n;i++){
int num=s[i]/m;
if(s[i]%m!=0) num++;
net.insert(ss,i,num);
tot+=num;
net.insert(i+n,t,num);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) continue;
if(b[i]+mat[i][j]<a[j]){
net.insert(i,n+j,inf);
}
}
}
printf("Case %d: %d\n",++ca,tot-net.max_flow(ss,t));
}
return 0;
}
UVALive6571 It Can Be Arranged(最小路径覆盖)的更多相关文章
- HDU 4606 Occupy Cities (计算几何+最短路+二分+最小路径覆盖)
Occupy Cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 【HDU1960】Taxi Cab Scheme(最小路径覆盖)
Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- loj 1429(可相交的最小路径覆盖)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...
- 【HDU3861 强连通分量缩点+二分图最小路径覆盖】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...
- POJ 3216 最小路径覆盖+floyd
Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 6646 Accepted: 178 ...
- POJ3020Antenna Placement(最小路径覆盖+重在构图)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7788 Accepted: 3880 ...
- POJ 3020 (二分图+最小路径覆盖)
题目链接:http://poj.org/problem?id=3020 题目大意:读入一张地图.其中地图中圈圈代表可以布置卫星的空地.*号代表要覆盖的建筑物.一个卫星的覆盖范围是其周围上下左右四个点. ...
- 【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)
http://wikioi.com/problem/1904/ 这题没看数据的话是一个大坑(我已报告官方修复了),答案只要求数量,不用打印路径...orz 最小路径覆盖=n-最大匹配,这个我在说二分图 ...
- hiho 第118周 网络流四·最小路径覆盖
描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游 ...
随机推荐
- 编译mgiza的准备
cmake之前需要首先设置环境变量: export BOOST_LIBRARYDIR=$BOOST_ROOT/lib64export BOOST_ROOT=/home/noah/boost_1_57_ ...
- matlab封装DLL混合编程总结
最近做了个项目要用到matlab做些算法处理,然后用.net项目调用这个类,我把这个matlab封装dll总结了下如下: matlab是商业数学软件,优势是在算法开发上面有很强的功能,提供了很多数学算 ...
- .net控件事件中的Sender
private void button2_Click(object sender, RoutedEventArgs e) { } 最近看WPF内容,回顾下.net大家天天都在用,却不是十分关注的一个对 ...
- opengl基础学习专题 (二) 点直线和多边形
题外话 随着学习的增长,越来越觉得自己很水.关于上一篇博文中推荐用一个 学习opengl的 基于VS2015的 simplec框架.存在 一些问题. 1.这个框架基于VS 的Debug 模式下,没有考 ...
- SQL 跟踪方法相关介绍
oracle sql跟踪方法:1.sql_trace打开跟踪:alter session set sql_trace=true;为跟踪文件做标记:alter session set tracefile ...
- Collaborative filtering
Collaborative filtering, 即协同过滤,是一种新颖的技术.最早于1989年就提出来了,直到21世纪才得到产业性的应用.应用上的代表在国外有Amazon.com,Last. ...
- Linux下如何使CP命令不提示覆盖
在Linux下使用CP命令,经常会提示是否覆盖,如果是太批量的文件覆盖,老是这么提示,会很烦的.那如何解决这个问题呢? 我们先来看一下原因吧! 一般我们使用的命令是cp -rf sourcefile ...
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- Vue2.0的通用组件
饿了么基于Vue2.0的通用组件开发之路(分享会记录) Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库. ...
- ostream类重载的operator<<()函数
ostream类重载了operator<<()以识别不同的类型,如: int short long unsigned int unsigned short unsigned long f ...