题目:Alice 要拍电影,每一天只能参与一部电影的拍摄,每一部电影只能在 Wi 周之内的指定的日子拍摄,总共需要花 Di 天时间,求能否拍完所有电影。

典型的二分图多重匹配,这里用了最大流的 dinic 算法。构图:源点向每部电影流容量为 Di 的边,电影向允许的日期流容量为 1 的边,每一天向汇点流容量为 1 的边。跑一次最大流,如果最大流等于 ∑D,那么就可以。

一开始用了多路增广忘了把流量为零的 d 设为 -1……悲剧……TLE 了。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std; const int MAXV = 520, FILM = 400, MAXE = 15000, INF = 0x3f3f3f3f;
struct edge{
int to, cap, next;
edge(){};
edge(int to_, int cap_, int next_):to(to_), cap(cap_), next(next_){};
} es[MAXE];
int head[MAXV], d[MAXV], que[MAXV], tot, tmp[8]; void init(){
memset(head, -1, sizeof(head));
tot = 0;
} inline void add2(const int &a, const int &b, const int &cap){
// printf("%d---%d: %d\n", a, b, cap);
es[tot] = edge(b, cap, head[a]); head[a] = tot++;
es[tot] = edge(a, 0, head[b]); head[b] = tot++;
} bool bfs(int s, int t){
memset(d, -1, sizeof(d));
d[s] = 0;
int hh = 0, tt = 1;
que[0] = s;
while(hh < tt){
int u = que[hh++];
if(u == t)return true;
for(int i = head[u]; ~i; i = es[i].next){
int v = es[i].to;
if(d[v] == -1 && es[i].cap){
d[v] = d[u] + 1;
que[tt++] = v;
}
}
}
return false;
} int dfs(int s, int t, int low){
if(s == t) return low;
int ret = 0;
for(int i = head[s]; ~i; i = es[i].next){
int v = es[i].to, f = es[i].cap;
if(d[v] == d[s] + 1 && f && (f = dfs(v, t, min(low - ret, f)))){
es[i].cap -= f;
es[i^1].cap += f;
ret += f; //多路增广
if(ret == low) break;
}
}
if(!ret) d[s] = -1; //这里剪枝非常重要
return ret;
} int dinic(int s, int t){
int ans = 0;
while(bfs(s, t)){
ans += dfs(s, t, INF);
}
return ans;
} int main(){
freopen("in.txt", "r", stdin);
int T, N, D, W;
scanf("%d", &T);
while(T--){
init();
int sum = 0, day = 0;
scanf("%d", &N);
for(int i = 0; i < N; ++i){
for(int j = 1; j <= 7; ++j) scanf("%d", &tmp[j]);
scanf("%d%d", &D, &W);
day = max(day, W);
add2(0, FILM + i, D);
sum += D;
for(int w = 0; w < W; ++w){
for(int j = 1; j <= 7; ++j){
if(tmp[j]) add2(FILM + i, w * 7 + j, 1);
}
}
}
for(int i = day * 7; i > 0; --i){
add2(i, 500, 1);
}
int ans = dinic(0, 500);
if(ans == sum) printf("Yes\n");
else printf("No\n");
}
return 0;
}

POJ 1698 Alice's Chance的更多相关文章

  1. poj 1698 Alice‘s Chance

    poj 1698  Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...

  2. 图论--网络流--最大流--POJ 1698 Alice's Chance

    Description Alice, a charming girl, have been dreaming of being a movie star for long. Her chances w ...

  3. poj 1698 Alice's Chance 最大流

    题目:给出n部电影的可以在周几拍摄.总天数.期限,问能不能把n部电影接下来. 分析: 对于每部电影连上源点,流量为总天数. 对于每一天建立一个点,连上汇点,流量为为1. 对于每部电影,如果可以在该天拍 ...

  4. POJ 1698 Alice&#39;s Chance(最大流+拆点)

    POJ 1698 Alice's Chance 题目链接 题意:拍n部电影.每部电影要在前w星期完毕,而且一周仅仅有一些天是能够拍的,每部电影有个须要的总时间,问能否拍完电影 思路:源点向每部电影连边 ...

  5. poj 1698 Alice&#39;s Chance 拆点最大流

    将星期拆点,符合条件的连边,最后统计汇点流量是否满即可了,注意结点编号. #include<cstdio> #include<cstring> #include<cmat ...

  6. Alice's Chance POJ - 1698(按时间点建边)

    Alice's Chance Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7791   Accepted: 3174 De ...

  7. 2018.07.06 POJ1698 Alice's Chance(最大流)

    Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Description Alice, a charming girl, have been ...

  8. POJ 1698 最大流

    Alice's Chance Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7327   Accepted: 2992 De ...

  9. 【POJ 1698】Alice's Chance(二分图多重匹配)

    http://poj.org/problem?id=1698 电影和日子匹配,电影可以匹配多个日子. 最多有maxw*7个日子. 二分图多重匹配完,检查一下是否每个电影都匹配了要求的日子那么多. #i ...

随机推荐

  1. 1.爬虫 urlib库讲解 Handler高级用法

    在前面我们总结了urllib库的 urlopen()和Request()方法的使用,在这一小节我们要使用相关的Handler来实现代理.cookies等功能. 写在前面: urlopen()方法不支持 ...

  2. react错误总结

    react-native 错误总结 The development server returned response error code: 500 in react-native https://b ...

  3. python之time和os模块

    1.time.time()获得的是一个时间戳,距离1970年以来多少秒 2.time.strftime(),按固定格式设置时间 import time print(time.localtime())# ...

  4. BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...

  5. 软工实践Beta冲刺(7/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  6. cmd端口占用查看和关闭端口

    cmd——回车,输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不 ...

  7. LTE中基于S1的切换

    1:源eNodeB决定进行基于S1的切换.S1切换的原因可能是源eNodeB和目标eNodeB之间不存在X2连接,或者源eNodeB根据其他情况作出的判断. 2:源eNodeB向源MME发送Hando ...

  8. 【EasyNetQ】- 发布确认

    默认的AMQP发布不是事务性的,并不保证您的消息实际到达代理.AMQP确实指定了事务发布,但是使用RabbitMQ它非常慢,我们还没有通过EasyNetQ API支持它.对于高性能保证交付,建议您使用 ...

  9. jsp实用过滤器写法

    使用过滤器来给servlet设置编码 public class CharacterEncodingFilter implements Filter{ @Override public void des ...

  10. Linux产生背景

    By francis_hao Oct 26,2016 很久很久以前,大概在1965年左右,由贝尔实验室(Bell).麻省理工学院(MIT)及通用电气公司(GE)共同发起了一个叫做Multics的项目, ...