/**
zoj提交评判不了,所以不知道代码正不正确。思路是应该没问题的。如果有不对的地方,请多指教。 题目:Shoot the Bullet ZOJ - 3229
链接:https://vjudge.net/problem/20756
题意:
高富帅给m个女神拍照,拍照n天,第i天给ci个女神拍照,给出了具体ci个女神的编号,以及在第i天给ci个女神分别给出拍照数量限制[l,r]。
第i天最多拍照Di次。拍照n天后,第i个女神总共最少拍照Gi次。求高富帅最多拍照次数。 思路:
建立源点s,t. s指向所有的天数,下界为0,上界为Di。所有的女神指向t,下界为Gi,上界INF。天数指向女神,下界为l,上界为r。
将有源汇有上下界变成无源汇有上界,求可行流。
t指向s,下界为0,上界为INF。增加超级源汇点S,T。
对于每个点i。in[i]表示入度的边的下界和,out[i]表示出度的边的下界和,为了进出该节点流量相等。
如果in[i]>out[i],那么S连一条到i的下界为0,上界为in[i]-out[i]的边。
如果in[i]<out[i],那么i连一条到T的下界为0,上界为out[i]-in[i]的边。 S到T跑最大流。如果flow== 所有in[i]-out[i]的和 (当in[i]>out[i]) 即:附加边都是满载。 那么有可行流。 然后在求一次s到t的最大流即是最终结果。不需要删除t到s的那条上界INF的边,也不用删除S,T.因为跑s到t的最大流的时候,t->s的流量会增广s->t回流,这里的回流值便是所有的下界和。
所以s到t的最大流就是最终的结果,已经包括了所有下界的值。
至于S,T不影响s到t的最大流,已经满载。根据dinic,只走残留网络,所以无法到达T。到达S的路径无法到达t.所以不受影响。 具体某一天某女神的拍照数量则要加上相应的下界值。 */
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
const int N = ;///n+m=1365
int in[N];
int out[N];
struct Edge{
int from, to, cap, flow;
Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}
};
struct Dinic{
int n, m, s, t;
vector<Edge> edges;
vector<int> G[N];
bool vis[N];
int d[N];
int cur[N]; void init(int n)
{
this->n = n;
for(int i = ; i <= n; i++) G[i].clear();
edges.clear();
} void AddEdge(int from,int to,int cap)
{
edges.push_back(Edge(from,to,cap,));
edges.push_back(Edge(to,from,,));
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool BFS()
{
memset(vis, , sizeof vis);
queue<int> Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
for(int i = ; i < G[x].size(); i++)
{
Edge &e = edges[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow)
{
vis[e.to] = ;
d[e.to] = d[x]+;
Q.push(e.to);
}
}
}
return vis[t];
} int DFS(int x,int a)
{
if(x==t||a==) return a;
int flow = , f;
for(int &i = cur[x]; i < G[x].size(); i++)
{
Edge& e = edges[G[x][i]];
if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
{
e.flow += f;
edges[G[x][i]^].flow -= f;
flow += f;
a -= f;
if(a==) break;
}
}
return flow;
} int Maxflow(int s,int t)
{
this->s = s, this->t = t;
int flow = ;
while(BFS())
{
memset(cur, , sizeof cur);
flow += DFS(s,INF);
}
return flow;
}
};
vector<int> ans;
vector<int> dw;
int main()
{
int n, m;
while(scanf("%d%d",&n,&m)==)
{
int s = , t = n+m+;
Dinic dinic;
dinic.init(t+);
memset(in, , sizeof in);
memset(out, , sizeof out);
ans.clear();
dw.clear();
int G;
for(int i = ; i <= m; i++){
scanf("%d",&G);
dinic.AddEdge(i+n,t,INF);
in[t]+=G;
out[i+n]+=G;
}
int C, D, T, L, R;
for(int i = ; i <= n; i++){
scanf("%d%d",&C,&D);
dinic.AddEdge(s,i,D);
for(int j = ; j <= C; j++){
scanf("%d%d%d",&T,&L,&R);
T++;
dinic.AddEdge(i,T+n,R-L);///T+n( ⊙ o ⊙ )啊!
ans.push_back(dinic.edges.size()-);
dw.push_back(L);
out[i]+=L;
in[T+n]+=L;
}
} dinic.AddEdge(t,s,INF); int ss = t+, tt = t+;
int sum = ;
for(int i = ; i <= t; i++){
if(in[i]>out[i]){
sum += in[i]-out[i];
dinic.AddEdge(ss,i,in[i]-out[i]);
}
if(in[i]<out[i]){
dinic.AddEdge(i,tt,out[i]-in[i]);
}
}
int flow = dinic.Maxflow(ss,tt);
//cout<<"sum = "<<sum<<endl;
//cout<<"flow = "<<flow<<endl;
if(flow==sum){
printf("%d\n",dinic.Maxflow(s,t));///这个就是最大流,但是下面的具体flow需要再加上 下界。
for(int i = ; i < ans.size(); i++){
printf("%d\n",dinic.edges[ans[i]].flow+dw[i]);
}
}else
{
printf("-1\n");
}
printf("\n");
}
return ;
}

Shoot the Bullet ZOJ - 3229 有源汇有上下界的最大流的更多相关文章

  1. zoj 3229 有源汇有上下界的最大流模板题

    /*坑啊,pe的程序在zoj上原来是wa. 题目大意:一个屌丝给m个女神拍照.计划拍照n天,每一天屌丝最多个C个女神拍照,每天拍照数不能超过D张,并且给每一个女神i拍照有数量限制[Li,Ri], 对于 ...

  2. zoj3229 Shoot the Bullet(有源汇有上下界的最大流)

    题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...

  3. BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流

    https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...

  4. sgu 176 有源汇有上下界的最小流模板题

    /*参考博文:http://hi.baidu.com/dragon_eric123/item/82e259200ece744046996282 有上下界的有源最小流 */ #include<st ...

  5. Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法

    /** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...

  6. 【模板】有源汇有上下界最大流(网络流)/ZOJ3229

    先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...

  7. Shoot the Bullet(有源汇带上下界最大流)

    有源汇带上下界最大流 在原图基础上连一条汇点到源点流量为inf的边,将有源汇网络流转化为无源汇网络流用相同方法判断是否满流,如果满流再跑一边源点到汇点的最大流就是答案 例题:Shoot the Bul ...

  8. [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流

    poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...

  9. vijos P1213 80人环游世界(有源汇的上下界费用流)

    [题目链接] https://vijos.org/p/1213 [题意] m个人将n个点访问完,每个点能且只能访问v次,点点之间存在有权边,问最小费用. [思路] 有源汇的上下界最小费用最大流. 每个 ...

随机推荐

  1. python安装包是出现错误解决

    /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed/limits.h:168:61: fatal error: limits.h: No such file ...

  2. Android跟踪NDK崩溃信息

    1.NDK编译jni时增加调试信息: $NDK_ROOT/ndk-build -B NDK_DEBUG=1 2.发生崩溃时,logcat中收集日志: - ::): Added shared lib / ...

  3. in_array() 和array_search的区别

    在判断字符串是否在某个数组里面的时候,我们会经常用到in_array()和array_search这两个函数. 他们的用法都是在数组中搜索给定的值,但是不同的是, in_array()给定的值 val ...

  4. JMS之——ActiveMQ 高可用与负载均衡集群安装、配置(ZooKeeper + LevelDB + Static discovery)

    一.说明 从 ActiveMQ 5.9 开始, ActiveMQ 的集群实现方式取消了传统的 Master-Slave 方式,增加了基于ZooKeeper + LevelDB 的 Master-Sla ...

  5. [ES6] 11. String Templates

    ECMAscript 6 lets us use string templates to gain a lot more control over strings in JavaScript. var ...

  6. 引用类型之object和date详解

    引用类型的值是引用类型的实例,js中的引用类型是一种数据类型,用于将数据和功能组织在一起(也可叫对象定义,因为描述一类对象具有的属性和方法) 1.Object类型 大多数引用类型都是object类型, ...

  7. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何声明定时器,使用定时器TON模块 TC3

    TON功能块功能: 当输入为高电平时,计时器开始计时,CV表示计时器计时的当前值,而PV则是计时的目标值,当CV的值等于PV的值时,输出置1.     在主程序接下去的地方按下F2并添加TON功能块. ...

  8. 极光推送sdk使用

    创建应用 进入极光控制台后,点击“创建应用”按钮,进入创建应用的界面. 填上你的应用程序的名称以及应用包名这二项就可以了, 最后点击最下方的 “创建我的应用”按钮,创建应用完毕.   创建应用   填 ...

  9. NestedScrollView嵌套RecyclerView

    天气渐寒,然学习不可懈怠,记录一下使用NestedScrollView嵌套RecyclerView的两个问题,以后遇到可以来这里温故. 应该说在MD中,RecyclerView代替了ListView, ...

  10. shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息

    方法二:使用mysql参数的方法 mysql -u$user -p$pass -D $db -e "select host from user;"当然,可以通过将传参的方式来传递 ...