题目:Shoot the Bullet

收藏:http://www.tuicool.com/articles/QRr2Qb

把每一天看成一个点,每个女孩也看成一个点,增加源和汇s、t,源向每一天连上[0,d]的边,每一天与每个女孩如果有拍照任务的话连上[l,r]的边,

每个女孩与汇连上[g,oo]的边,于是构成一个有上下界的图。

所以这道题目我们可以转换一下,只要连一条T → S的边,流量为无穷,没有下界,那么原图就得到一个无源汇的循环流图。

接下来的事情一样:原图中的边的流量设成自由流量ci – bi。新建源点SS汇点TT,求Mi,连边。然后求SS → TT最大流,判是否满流。

view code#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int INF = 1<<30;
const int N = 1500;
const int M = 1e6;
int n, m, pre[N], d[N], cur[N], s, t, ss, tt;
int dis[N], in[N], low[36666], lcnt;
bool vis[N]; struct edge
{
int u, v, cap, next;
edge() {}
edge(int u, int v, int c, int next):u(u),v(v),cap(c),next(next) {}
}e[M];
int ecnt; void addedge(int u, int v, int w)
{
e[ecnt] = edge(u, v, w, pre[u]);
pre[u] = ecnt++;
e[ecnt] = edge(v, u, 0, pre[v]);
pre[v] = ecnt++;
} bool BFS(int s, int t)
{
memset(vis, 0, sizeof(vis));
queue<int >q;
q.push(s);
vis[s] = 1;
d[s] = 0;
while(!q.empty())
{
int x = q.front(); q.pop();
for(int i=pre[x]; ~i; i=e[i].next)
{
int v = e[i].v;
if(!vis[v] && e[i].cap>0)
{
vis[v] = 1;
d[v] = d[x] + 1;
q.push(v);
}
}
}
return vis[t];
} ll DFS(int x, ll c, int s, int t)
{
if(x==t || c==0) return c;
ll flow = 0, f;
for(int &i = cur[x]; ~i; i = e[i].next)
{
int v = e[i].v;
if(d[v] == d[x]+1 && (f=DFS(v, min(c, (ll)e[i].cap), s, t))>0)
{
e[i].cap -= f;
e[i^1].cap += f;
flow += f;
c -= f;
if(c==0) break;
}
}
return flow;
} ll Maxflow(int s, int t)
{
ll flow = 0;
while(BFS(s, t))
{
memcpy(cur, pre, sizeof(pre));
flow += DFS(s, INF, s, t);
}
return flow;
} int main()
{
// freopen("in.txt", "r", stdin);
while(scanf("%d%d", &n, &m)>0)
{
ll sum = 0;
int g, id, R, k;
s = 0, t = m+n+1;
ss = n+m+2, tt = m+n+3;
memset(pre, -1, sizeof(pre));
memset(in, 0, sizeof(in));
ecnt = 0, lcnt = 0;
for(int i=1; i<=m; i++)
{
scanf("%d", &g);
in[i+n] -= g;
in[t] += g;
}
for(int i=1; i<=n; i++)
{
scanf("%d%d", &k, &dis[i]);
for(int j=0; j<k; j++)
{
scanf("%d%d%d", &id, &low[++lcnt], &R);
addedge(i, id+n+1, R-low[lcnt]);
in[i] -= low[lcnt];
in[id+n+1] += low[lcnt];
}
}
for(int i= 1; i<=n; i++) addedge(s, i, dis[i]);
for(int i= 1; i<=m; i++) addedge(i+n, t, INF);
addedge(t, s, INF);
for(int i = s; i<=t; i++)
{
if(in[i]>0) addedge(ss, i, in[i]), sum += in[i];
if(in[i]<0) addedge(i, tt, -in[i]);
}
if(Maxflow(ss, tt)==sum)
{
Maxflow(s, t);
addedge(t, s, -INF);
int ans = 0;
for(int i = pre[0]; ~i; i=e[i].next)
{
ans += e[i^1].cap ;
// printf("u = %d, cap = %d\n", e[i^1].u, e[i^1].cap);
}
printf("%d\n", ans);
for(int i=1; i<=lcnt; i++) printf("%d\n", e[2*i-1].cap+low[i]);
}
else puts("-1");
puts("");
}
return 0;
}

zoj 3229 Shoot the Bullet(无源汇上下界最大流)的更多相关文章

  1. ZOJ 3229 Shoot the Bullet(有源汇上下界最大流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 题目大意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给 ...

  2. ZOJ - 3229 Shoot the Bullet (有源汇点上下界最大流)

    题意:要在n天里给m个女生拍照,每个女生有拍照数量的下限Gi,每天有拍照数量的上限Di,每天当中每个人有拍照的上限Lij和Rij.求在满足限制的基础上,所有人最大能拍多少张照片. 分析:抛开限制,显然 ...

  3. zoj 2314 Reactor Cooling (无源汇上下界可行流)

    Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...

  4. ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...

  5. 【无源汇上下界最大流】SGU 194 Reactor Cooling

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=194 题目大意: n个点(n<20000!!!不是200!!!RE了无数次) ...

  6. hdu 4940 Destroy Transportation system (无源汇上下界可行流)

    Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  7. zoj2314 无源汇上下界可行流

    题意:看是否有无源汇上下界可行流,如果有输出流量 题解:对于每一条边u->v,上界high,下界low,来说,我们可以建立每条边流量为high-low,那么这样得到的流量可能会不守恒(流入量!= ...

  8. ZOJ2314 Reactor Cooling(无源汇上下界可行流)

    The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...

  9. ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】

    题目:problemId=3442" target="_blank">ZOJ Problem Set - 3229 Shoot the Bullet 分类:有源有汇 ...

随机推荐

  1. JS Date.Format

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  2. css3文字导航鼠标悬停气泡动画特效源码下载

    效果体验:http://hovertree.com/texiao/css3/8/ 效果图: 点击这里下载:http://hovertree.com/h/bjaf/8d5vmddq.htm 更多特效:h ...

  3. C#开发中可能会用到的一些小贴士(转)

    转至http://www.cnblogs.com/Ebony-Ivory/p/4380106.html C#篇: 1.目标平台的选择 64位操作系统在编译VS里的程序时,根据需要设置项目属性的“目标平 ...

  4. DIV嵌套垂直居中

    第一记住一点:父级相对定位,子级绝对定位 下面演示CSS样式: .父级DIV{ margin:0px auto; position:relative; border:2px solid #ff0000 ...

  5. SignalR-支持平台

    1.支持的服务器操作系统: SignalR 服务器组件可以驻留在下列服务器或客户端操作系统.请注意, SignalR 使用 Websocket,为 Windows Server 2012 或 Wind ...

  6. python爬虫——爬取NUS-WIDE数据库图片

    实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm   由于这个数据只给了每个图片的URL,所以需 ...

  7. 欧拉计划之题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}

    本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/10-9a--b--c--1000a-b-c #include <std ...

  8. winform(MDI窗体容器、权限设置)

    一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内 ...

  9. jQuery eislideshow 图片轮播

    在线实例 基础演示 自动播放 使用方法 <div id="ei-slider" class="ei-slider"> <ul class=&q ...

  10. SVG描边动画原理

    SVG描边动画原理其实很简单,主要利用以下两个属性 stroke-dasharray 制作虚线,使得黑白相间, stroke-dashoffset 使得虚线向开头偏移,这里的1500不精确,是我随便取 ...