题目链接

题目大意:


解题思路:

  1. 首先我们发现对于每条边至少要覆盖一次,最多覆盖无数次
  2. 那么就有点像上下界网络流了[1,INF][1,INF][1,INF]的限制关系
  3. 跑一边最小流就可以了!!

#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];
void init() {ms(in,0), ms(out,0), ms(head,-1);cnt = 0;
}
int main() {IOS;init();cin >> n;int s1 = 0, t1 = n+1, s2 = n+2, t2 = n+3;for(int i = 1; i <= n; ++ i) {int x;cin >> x;for(int j = 1; j <= x; ++ j) {int id;cin >> id;in[id] ++;out[i] ++; add(i,id,INF-1);}add(s1,i,INF-1); // 每个点都可以是起点和终点add(i,t1,INF-1);}for(int i = 0; i <= n+1; ++ i) if(in[i] > out[i]) add(s2,i,in[i]-out[i]);else add(i,t2,out[i]-in[i]);add(t1,s1,INF);s = s2, t = t2;get_maxflow();int flow1 = e[cnt-1].len;e[cnt-1].len=0;e[cnt-2].len=0;s = t1,  t = s1;// 和最大流不同,就是这里是从原图的汇点到源点进行流量回退cout << flow1 - get_maxflow();return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    学习资料+题目链接 题目大意: 模板讲解 #include <bits/stdc++.h> #define mid ((l + r) >> 1) #define Lson rt ...

  8. luogu P4843 清理雪道

    嘟嘟嘟 这其实就是一个最小流的板子题.把每一条边的流量至少为1,然后建立附加源汇跑一遍最大流,连上\(t, s\),再跑一遍最大流就是答案. 刚开始我想错了:统计每一个点的出度和入度,去两者较大值\( ...

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

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

最新文章

  1. java和js的正则表达式一样吗_JavaScript与Java正则表达式写法的区别
  2. Mybatis sql注入问题
  3. java获取数组穷举_请教一下两个数组各取一个元素生成新的数组的穷举算法设计?...
  4. 12345组成三个不重复数java,求大神帮忙!五子棋!只能识别按顺序识别!例如 12345 不能...
  5. Jackson使用详解
  6. maya刷权重时有个叉_运营小白如何注册一个高权重的抖音账号?
  7. Python正则表达式re模块
  8. SQL基础(八)-- sql左右连接中的on and 和 on where 的区别
  9. java同步器__学习笔记
  10. SharePoint Server 2016 部署安装(七)—— 配置SharePoint Server
  11. php 调试常用函数,PHP几个常用的去空、分组、调试数组函数
  12. mybatis动态sql传ist集合參与传数组参数
  13. 各位,请慎用 subList!原来这么多坑!!
  14. Android 自动接听 adb,GitHub - AndroidMsky/RootPlay: 安卓手机秒变网络摄像头,自动接起QQ视频。欢迎star,fork,Issues。...
  15. wp手机能装linux系统吗,老机焕新生!Lumia 950XL也能跑Win10
  16. IPv4编址;A类、B类、C类、D类、E类IP地址(IP地址;网络地址和主机地址;子网掩码;网关;广播地址;)
  17. java过滤器的作用_javaweb过滤器的作用,过滤器filter的作用是什么?
  18. Team Queue -uva
  19. Spring 4.x 源码系列4-创建bean实例
  20. Qt 并行运算高级API QtConcurrent

热门文章

  1. Python Beautiful Soup类的基本元素
  2. 三分钟教你快速选择机器视觉传感器
  3. 一文了解点特征直方图
  4. 基于OpenCV的实用图像处理操作
  5. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法
  6. 第五篇:协调和协定之选举算法
  7. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)
  8. OpenStack入门修炼之实战--实现阿里云ESC多FLAT网络(21)
  9. Java基础--定时任务Timer
  10. 22种代码坏味道及重构手段