题目: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. const char and static const char

    部分内容摘自:https://blog.csdn.net/ranhui_xia/article/details/32696669 The version with const char * will ...

  2. Python 3 学习笔记之——标准库概述

    1. 操作系统接口 os 模块提供了一些与操作系统相关联的函数. >>> os.getcwd() # 获取当前工作目录 '/home/senius' >>> os. ...

  3. UVA215 Spreadsheet

    这道题题目大意就是计算带有单元格引用的各单元格的值. 这道题本身不难,有以下几个关键点: 1.如何判断一个单元格循环引用 2.注意对字符串的细致处理 我出现的错误出现在以上两个方面,思路本身是不难的. ...

  4. MUI scroll 定位问题

    做一个微信项目,使用MUI做框架,在使用scroll定位的时候,出现了定位不准确的问题,查询了好多资料,得知他是相对定位.折腾了好久,才搞定,现在做一个笔记. mui('body').on('tap' ...

  5. 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息

    如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...

  6. Maven中如何将源码之外的文件打包及添加本地jar

    <build> <resources> <resource> <directory>src/main/resources</directory&g ...

  7. asp.net中的cookie

    一.cookie导读,理解什么是cookie 1.什么是cookie:cookie是一种能够让网站服务器把少量数据(4kb左右)存储到客户端的硬盘或内存.并且读可以取出来的一种技术. 2.当你浏览某网 ...

  8. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  9. Link Cat Tree (连喵树) 学习笔记

    Link Cat Tree 一.感性定义 所谓连喵树,即一种对森林支持修改,查询,连边,删边等操作的数据结构(姑且算她是吧).她用一颗颗互相连接的辅助树维护原森林的信息,辅助树相互连接的边叫虚边,辅助 ...

  10. C++——继承时的this指针

    1.this指针只在类的成员函数中使用,当类的成员函数需要用到自己的指针时就要用到this指针.但静态函数不能使用this关键字,其解释是:因为this是个引用,哪个对象调用方法就引用哪个对象. 而静 ...