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&#39;s Chance的更多相关文章

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

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

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

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

  3. HDU 4791 &amp; ZOJ 3726 Alice&#39;s Print Service (数学 打表)

    题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...

  4. HDU 4791 Alice&#39;s Print Service 水二分

    点击打开链接 Alice's Print Service Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  5. hdu 4122 Alice&#39;s mooncake shop (线段树)

    题目大意: 一个月饼店每一个小时做出月饼的花费不一样. 储存起来要钱.最多存多久.问你把全部订单做完的最少花费. 思路分析: ans = segma( num[]*(cost[] + (i-j)*s) ...

  6. 2-sat(石头、剪刀、布)hdu4115

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  7. hdu 4115 Eliminate the Conflict ( 2-sat )

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. hdu4115 Eliminate the Conflict

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  9. Spark GraphX实例(2)

    5. 图的转换操作 图的转换操作主要有以下的方法: (1) Graph.mapVertices():对图的顶点进行转换,返回一张新图: (2) Graph.mapEdges():对图的边进行转换,返回 ...

随机推荐

  1. Streak OpenCart 商城自适应主题模板 ABC-0010

    兼容浏览器 IE9, Firefox, Safari, Opera, Chrome OpenCart版本号 OpenCart 1.5.x, OpenCart 1.5.6.x, OpenCart 1.5 ...

  2. 安全扫描工具-AppScan

    AppScan主要作用是对页面进行安全扫描的工具

  3. TabHost+RadioGroup搭建基础布局

    xml的形势如下: <tabhost> <linearlayout vertival> <framlayout weight=1/> <tabwidget g ...

  4. Guest与virtio netdev交互模式

    Qemu为virtio设备分配了专门的pci设备ID,device IDs (vendor ID 0x1AF4) from 0x1000 through 0x10FF,而pci子系统中的厂商ID和设备 ...

  5. 联想昭阳e43l笔记本配置

    驱动精灵硬件检测报告 版本:2015.3.26.1363(8.1.326.1363)========================================================== ...

  6. 最小二乘法 (转)good

    最小二乘法也称为最小平方法,是一种数据优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配. 最小二乘法最初由高尔顿在创立回归分析的时候提出,现在已经成为探索变量间关系最重要的方法,最小二乘法根据 ...

  7. Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

    本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...

  8. 玩转Web之JavaScript(二)-----javaScript语法总结(二) 涉及Date与数组的语法

    Date: document.write(document.lastModified)  网页最后一次更新时间 a=new Date();  //创建 a 为一个新的时期象 y=a.getY ear( ...

  9. 《学习opencv》笔记——矩阵和图像处理——cvGEMM,cvGetCol,cvGetCols and cvGetDiag

    矩阵和图像操作 (1)cvGEMM函数 其结构 double cvGEMM(//矩阵的广义乘法运算 const CvArr* src1,//乘数矩阵 const CvArr* src2,//乘数矩阵 ...

  10. std::list.pop_back() 弹空了列表导致的崩溃

    core文件输出: (gdb) bt # # ) at xxxxx/sql/signal_handler.cc: # <signal handler called> # # # # # 0 ...