Alice's Chance
id=1698" style="background-color:rgb(51,255,51)">主题链接
- 意甲冠军:
爱丽丝要拍电影。有n部电影,规定爱丽丝第i部电影在每一个礼拜仅仅有固定的几天能够拍电影,且仅仅能在前wi个周拍,而且这部电影要拍di天才干结束。问爱丽丝能不能拍全然部的电影
第一行代表有多少组数据,对于每组数据第一行代表有n部电影,接下来2到n+1行,每行代表一个电影,每行9个数,前面7个数,1代表拍。0代表不拍,第8个数代表要拍几天,第9个数代表有几个礼拜时间拍 - 分析:
对于每一个电影。di - x[0] - x[1] - ... - x[t] = 0,di表示这个电影须要的天数,x[]表示电影相应的这些天是否选择(取值为零或一)
对于每一天。y[0] - y[1] - ... - y[t] <= 1,1表示这一天最多拍一个电影。y[]表示相应的电影是否在这一天拍(取值为零或一)
struct Edge
{
int from, to, cap, flow;
bool operator< (const Edge& rhs) const
{
return from < rhs.from || (from == rhs.from && to < rhs.to);
}
}; const int MAXV = 500;
struct ISAP
{
int n, m, s, t;
vector<Edge> edges;
vector<int> G[MAXV]; // 邻接表。G[i][j]表示结点i的第j条边在e数组中的序号
bool vis[MAXV]; // BFS使用
int d[MAXV]; // 从起点到i的距离
int cur[MAXV]; // 当前弧指针
int p[MAXV]; // 可增广路上的上一条弧
int num[MAXV]; // 距离标号计数 void AddEdge(int from, int to, int cap)
{
edges.push_back((Edge) { from, to, cap, 0 });
edges.push_back((Edge) { to, from, 0, 0 });
m = edges.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(t);
vis[t] = 1;
d[t] = 0;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
REP(i, G[x].size())
{
Edge& e = edges[G[x][i]^1];
if(!vis[e.from] && e.cap > e.flow)
{
vis[e.from] = 1;
d[e.from] = d[x] + 1;
Q.push(e.from);
}
}
}
return vis[s];
} void ClearAll(int n)
{
this->n = n;
REP(i, n)
G[i].clear();
edges.clear();
} void ClearFlow()
{
REP(i, edges.size())
edges[i].flow = 0;
} int Augment()
{
int x = t, a = INF;
while(x != s)
{
Edge& e = edges[p[x]];
a = min(a, e.cap-e.flow);
x = edges[p[x]].from;
}
x = t;
while(x != s)
{
edges[p[x]].flow += a;
edges[p[x]^1].flow -= a;
x = edges[p[x]].from;
}
return a;
} int Maxflow(int s, int t, int need)
{
this->s = s;
this->t = t;
int flow = 0;
BFS();
memset(num, 0, sizeof(num));
REP(i, n) num[d[i]]++;
int x = s;
memset(cur, 0, sizeof(cur));
while(d[s] < n)
{
if(x == t)
{
flow += Augment();
if(flow >= need) return flow;
x = s;
}
int ok = 0;
FF(i, cur[x], G[x].size())
{
Edge& e = edges[G[x][i]];
if(e.cap > e.flow && d[x] == d[e.to] + 1) // Advance
{
ok = 1;
p[e.to] = G[x][i];
cur[x] = i; // 注意
x = e.to;
break;
}
}
if(!ok) // Retreat
{
int m = n-1; // 初值注意
REP(i, G[x].size())
{
Edge& e = edges[G[x][i]];
if(e.cap > e.flow)
m = min(m, d[e.to]);
}
if(--num[d[x]] == 0)
break;
num[d[x] = m + 1]++;
cur[x] = 0; // 注意
if(x != s)
x = edges[p[x]].from;
}
}
return flow;
} vector<int> Mincut() // call this after maxflow
{
BFS();
vector<int> ans;
REP(i, edges.size())
{
Edge& e = edges[i];
if(!vis[e.from] && vis[e.to] && e.cap > 0)
ans.push_back(i);
}
return ans;
} void Reduce()
{
REP(i, edges.size())
edges[i].cap -= edges[i].flow;
} void print()
{
printf("Graph:\n");
REP(i, edges.size())
printf("%d->%d, %d, %d\n", edges[i].from, edges[i].to , edges[i].cap, edges[i].flow);
}
} mf; int day[18]; int main()
{
int T, n, d, w;
RI(T);
FE(kase, 1, T)
{
int sum = 0;
RI(n);
mf.ClearAll(n + 7 * 50 + 2);
int S = 0, T = n + 7 * 50 + 1, Max = -1;
FE(i, 1, n)
{
FE(j, 1, 7)
RI(day[j]);
RII(d, w);
sum += d;
Max = max(Max, w);
mf.AddEdge(S, i, d);
FE(j, 1, 7)
if (day[j])
{
REP(k, w)
mf.AddEdge(i, n + k * 7 + j, 1);
}
}
FE(i, 1, 7) REP(j, Max)
mf.AddEdge(n + j * 7 + i, T, 1);
printf("%s\n", mf.Maxflow(S, T, INF) == sum ? "Yes" : "No");
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
Alice's Chance的更多相关文章
- POJ 1698 Alice's Chance(最大流+拆点)
POJ 1698 Alice's Chance 题目链接 题意:拍n部电影.每部电影要在前w星期完毕,而且一周仅仅有一些天是能够拍的,每部电影有个须要的总时间,问能否拍完电影 思路:源点向每部电影连边 ...
- poj 1698 Alice's Chance 拆点最大流
将星期拆点,符合条件的连边,最后统计汇点流量是否满即可了,注意结点编号. #include<cstdio> #include<cstring> #include<cmat ...
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...
- HDU 4791 Alice's Print Service 水二分
点击打开链接 Alice's Print Service Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu 4122 Alice's mooncake shop (线段树)
题目大意: 一个月饼店每一个小时做出月饼的花费不一样. 储存起来要钱.最多存多久.问你把全部订单做完的最少花费. 思路分析: ans = segma( num[]*(cost[] + (i-j)*s) ...
- 2-sat(石头、剪刀、布)hdu4115
Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu 4115 Eliminate the Conflict ( 2-sat )
Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu4115 Eliminate the Conflict
Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Spark GraphX实例(2)
5. 图的转换操作 图的转换操作主要有以下的方法: (1) Graph.mapVertices():对图的顶点进行转换,返回一张新图: (2) Graph.mapEdges():对图的边进行转换,返回 ...
随机推荐
- QEMU-KVM自己主动创建虚拟机,以指定IP构造
正在使用qemu不能指定创建虚拟机的过程IP住址,然而,在实际应用中,我们需要有一台虚拟机IP住址,不是人为的虚拟机操作系统配置. 于qemu虚拟机技术文档(http://qemu.weilnetz. ...
- 无阻塞情况connect生产EINPROGRESS错
今天的游戏开发client测试程序,非常多,因为出现client.后connect成功.代码证recv系统调用.后来发现,可能是由于socket默认模式被阻止,这将使很多client 接处于链接却不能 ...
- WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现
原文:WPF技术触屏上的应用系列(六): 视觉冲击.超炫系统主界面.系统入口效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体 ...
- Lua之Lua数据结构-TTLSA(6)(转) good
一. tabletable是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构 ...
- 有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?(转)
作者:覃超链接:http://www.zhihu.com/question/19977889/answer/13539702来源:知乎 平时就经常实践. 整个公司的code review就是使用这个. ...
- 【C语言探索之旅】 第三课:你的第一个程序
内容简介 1.课程大纲 2.第一部分第三课:你的第一个程序 3.第一部分第四课预告:变量的世界 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个 ...
- 【Android进阶】Listview分页加载数据的实现
Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...
- java.io.NotSerializableException
结果发现序列不成功非静态内部类时的序列中,出现以下异常: java.io.NotSerializableException: com.tang.sharedpreferencesdemo.MainAc ...
- poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)
模板 意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新. 每个边缘的价格值 = sum(后继结点重)*单价方值. 最低价格要求树值,它构成了一棵树n-1条边的最小价值. 算法: 1. ...
- 【转】Android 4.3源码下载及问题解决
[html] view plaincopy 1 2 3 4 5 6 7 8 9 10 11 jianguoliao@jianguoliao-Lenovo-IdeaPad-Y470:~$ cat /et ...