POJ 1698 Alice's Chance
题目: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的更多相关文章
- poj 1698  Alice‘s Chance
		
poj 1698 Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...
 - 图论--网络流--最大流--POJ 1698 Alice's Chance
		
Description Alice, a charming girl, have been dreaming of being a movie star for long. Her chances w ...
 - poj 1698 Alice's Chance 最大流
		
题目:给出n部电影的可以在周几拍摄.总天数.期限,问能不能把n部电影接下来. 分析: 对于每部电影连上源点,流量为总天数. 对于每一天建立一个点,连上汇点,流量为为1. 对于每部电影,如果可以在该天拍 ...
 - POJ 1698 Alice's Chance(最大流+拆点)
		
POJ 1698 Alice's Chance 题目链接 题意:拍n部电影.每部电影要在前w星期完毕,而且一周仅仅有一些天是能够拍的,每部电影有个须要的总时间,问能否拍完电影 思路:源点向每部电影连边 ...
 - poj 1698 Alice's Chance 拆点最大流
		
将星期拆点,符合条件的连边,最后统计汇点流量是否满即可了,注意结点编号. #include<cstdio> #include<cstring> #include<cmat ...
 - Alice's Chance POJ - 1698(按时间点建边)
		
Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7791 Accepted: 3174 De ...
 - 2018.07.06 POJ1698 Alice's Chance(最大流)
		
Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Description Alice, a charming girl, have been ...
 - POJ 1698 最大流
		
Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7327 Accepted: 2992 De ...
 - 【POJ 1698】Alice's Chance(二分图多重匹配)
		
http://poj.org/problem?id=1698 电影和日子匹配,电影可以匹配多个日子. 最多有maxw*7个日子. 二分图多重匹配完,检查一下是否每个电影都匹配了要求的日子那么多. #i ...
 
随机推荐
- Module安装
			
利用pip3 install numpy,代表安装了数学模块 pip3 install -U numpy,代表升级数学模块 有的时候需要升级pip本身,如上所示,直接执行pip3 install -U ...
 - JQuery Ajax执行过程AOP拦截
			
JQuery Ajax过程AOP:用于在Ajax请求发送过程中执行必备操作,比如加载数据访问令牌. $.ajaxSetup({ type: "POST", error: funct ...
 - ThinkPHP自定义成功界面、失败界面、异常界面
			
在ThinkPHP的手册中,附录里边的配置参考,有一个模板引擎设置. 或者在手册里面的控制器,跳转和重定向里面. 紧接着,就讲到了如何自定义这些界面. 将上诉的配置参数写到到配置文件里,修改路径到自己 ...
 - C++STL——堆栈
			
一.相关定义 原理:stack队列是一个线性存储表,插入和删除只在栈顶进行,从而构成了一个后进先出LIFO表. 入栈&出栈:元素的插入称为入栈,元素的删除称为出栈. stack是一种关联容器, ...
 - 《学习OpenCV》课后习题解答9
			
题目:(P126) 创建一个程序,使其读入并显示一幅图像.当用户鼠标点击图像时,获取图像对应像素的颜色值(BGR),并在图像上点击鼠标处用文本将颜色值显示出来. 解答: 本题关键是会用cvGet2D获 ...
 - 用Electron开发桌面应用app的相关文献集锦
			
1. 超棒的发声器(项目实战) 原文点此链接 2. Electron中文文档 原文点此链接
 - PHP+AJAX 实现表格实时编辑
			
https://blog.csdn.net/qq_29627497/article/details/81365107 源码链接:https://pan.baidu.com/s/1fAinVXU-nWt ...
 - web online ide &web online editor & web online playground & web online runtime
			
web online ide &web online editor web online ide &web online editor & web online playgro ...
 - Linux笔记二
			
用户和组 添加一个tom用户,设置它属于users组,并添加注释信息分步完成:useradd tom usermod -g users tom usermod -c "hr tom" ...
 - JSON语法(3)
			
JSON语法是JavaScript语法的子集. JSON语法规则 数据在名称/值对中 数据由逗号分割 花括号保存对象 方括号保存数组 JSON名称/值对 JSON数据的书写格式是:名称/值对. 名称/ ...