学习资料+题目链接

题目大意:


模板讲解

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = N;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)  {read(first);read(args...);
}
struct node {int to, next, len;
}e[maxn];
int head[maxn], cnt;
int n, m, s, t;
inline void add(int from, int to, int len) {e[cnt] = {to,head[from],len};head[from] = cnt ++;e[cnt] = {from,head[to],0};head[to] = cnt ++;
}int d[maxn],cur[maxn];
int pre[maxn], flow[maxn];bool bfs() {ms(d,0);queue<int> q;q.push(s); d[s] = 1;while(!q.empty()) {int u = q.front(); q.pop();for(int i = head[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[v] || e[i].len <= 0) continue;q.push(v);d[v] = d[u] + 1;}}      for(int i = 0; i <= t; ++ i) cur[i] = head[i];return d[t] != 0;
}int dfs(int u, int flow) {if(u == t) return flow;for(int &i = cur[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[u] + 1 != d[v] || e[i].len <= 0) continue;int delta = dfs(v,min(flow,e[i].len));if(delta <= 0) continue;e[i].len -= delta;e[i^1].len += delta;return delta;}return 0;
}int get_maxflow() {int maxFlow = 0, delta;while(bfs())//bfs进行构建最短路网络while(delta = dfs(s,INF))maxFlow += delta;return maxFlow;
}
//......................
int Tn, Tm, Gx[maxn], in[maxn], out[maxn];
// 对于原图的所有的点(包括原图的源点和汇点)求一个流入量in和一个流出量out
// 对于in需求量大的,我们新建一个源点(和原图不一样)去补充差值。
// 对于out需求量大的,我们新建式一个汇点去补充差值
// in和out数组是加状态的下界
// 而且第一遍跑出来的可行流是e[cnt-1].len,不是maxflow
// 第二遍从原图的源点到汇点的才是maxflow
void init() {ms(in,0), ms(out,0), ms(head,-1);cnt = 0;
}
int main() {IOS;while(cin >> Tn >> Tm) {init();for(int i = 1; i <= Tm; ++ i) cin >> Gx[i];int s1 = Tn+Tm+1, t1 = Tn+Tm+2, s2 = Tn+Tm+3, t2 = Tn+Tm+4;// s1和t1是原图的源点和汇点// s2和t2是无源汇上下界网络流的源点和汇点int C, D;for(int i = 1; i <= Tn; ++ i) {cin >> C >> D;int T, L, R;add(s1,i,D);in[i] += 0;in[s1] += 0;for(int j = 1; j <= C; ++ j) {cin >> T >> L >> R;T ++;in[T+Tn] += L, out[i] += L;add(i,T+Tn,R-L);               }} for(int i = 1; i <= Tm; ++ i) {in[t1] += Gx[i], out[i+Tn] += Gx[i];add(i+Tn,t1,INF-Gx[i]);}int sum = 0;for(int i = 1; i <= Tn+Tm+2; ++ i) {if(in[i] > out[i]) add(s2,i,in[i]-out[i]), sum += (in[i]-out[i]);else add(i,t2,out[i]-in[i]);}add(t1,s1,INF);s = s2, t = t2;if(get_maxflow()!=sum) cout << "-1\n\n";else {int flow1 = e[cnt-1].len;// 注意!!!s = s1, t = t1;e[cnt-1].len = 0;e[cnt-2].len = 0;// 原图源点向汇点连的边cout << flow1 + get_maxflow() << "\n\n";}}return 0;
}

有上下界网络流 ---- Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流相关推荐

  1. 洛谷 - P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流(有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:一共有 n 天,每天可以拍最多 D[ i ] 张照片,每天可以选择 C[ i ] 个少女进行拍照,每个少女的编号为 T[ i ][ j ] ,每个少女需要拍摄照片的区间为 ...

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

    描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utop ...

  3. P4043 [AHOI2014/JSOI2014]支线剧情(有源汇上下界最小费用可行流)

    传送门 约束每个点至少要经过一次,因此是上下界网络流. 每经过边都需要相应的边权,且要求耗费边权之和最小,因此是最小费用流. 存在多个终点,需要建立汇点 ttt ,因此是有源汇网络流. 即:有源汇上下 ...

  4. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  5. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  6. BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)

    题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...

  7. 3698: XWW的难题 有源汇上下界最大流

    有源汇上下界最大流,行列建图,下界为ai,ja_{i,j},上界为ai,j+1a_{i,j}+1,跑的飞起. 不要忘记判断上取整下取整相同的情况. #include<iostream> # ...

  8. 有上下界网络流 ---- P4843 清理雪道(DAG图上最小路径重复边覆盖)【模板】有源汇上下界最小流

    题目链接 题目大意: 解题思路: 首先我们发现对于每条边至少要覆盖一次,最多覆盖无数次 那么就有点像上下界网络流了[1,INF][1,INF][1,INF]的限制关系 跑一边最小流就可以了!! #in ...

  9. [BZOJ3698]XWW的难题(有源汇上下界最大流+讲解)

    题目: 我是超链接 题解: 建图的话和有源汇可行流一样 求解方法: 在新图上跑ss到tt的最大流(附加源汇) 若新图满流,那么一定存在一种可行流 记此时∑f(s,i)=sum1∑f(s,i)=sum1 ...

最新文章

  1. leetcode--下一个更大元素II--python
  2. 李飞飞新研究:基于深度学习和视觉化语言来了解不同物体间的关系
  3. 谈谈JIT编译器和本机影像生成器(NGen.exe)
  4. 从实验角度来验证混沌数据可以被预测吗?
  5. 【动态规划】炮兵阵地
  6. 全球及中国综艺节目产业营销策略分析及创新格局规划建议报告2021-2027年
  7. Android使用百度地图定位
  8. BZOJ-1057: [ZJOI2007]棋盘制作(单调栈)
  9. 《The C++ Standard Library》第50页 关于传递auto_ptr的问题
  10. 1.1 STL 概述
  11. java10---点餐系统
  12. 亚马逊出的平板电脑_加量不加价,亚马逊推出新款 Fire 7 平板电脑
  13. 《指针的编程艺术(第二版)》一第三章 指针与数组3.1 指针与一维数组
  14. java 泛型方法 类型_Java泛型方法
  15. Windows蓝屏漏洞(利用多种途径与分析)
  16. 一脸懵逼加从入门到绝望学习hadoop之Caused by: java.net.UnknownHostException: master报错
  17. ubuntu更新镜像源
  18. python爬取微博图片教程_Python爬取微博实例分析
  19. Aloha和时隙Aloha介绍与分析
  20. linux date 计算时间差,linux shell date 时间运算以及时间差计算方法

热门文章

  1. Servlet 传输中文乱码解决方法
  2. 收藏 | 卷积神经网络 C++ 从零开始实现
  3. 为什么机器学习项目非常难管理?
  4. 导师:学CV的不懂目标检测?那你别学了
  5. 【OpenCV 4开发详解】窗口交互操作
  6. python逐行读取文本
  7. 19.1 Linux监控平台介绍;19.2 zabbix监控介绍;19.3,19.4 安装zabbi
  8. 2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进
  9. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)
  10. Apache Tiles 学习(四)、Tiles实战