给你一个二分图 要求你求出对于k=[0~Mindegree] 每个点的度数至少为k所需要的最少边数 并输出方案

如果是单个询问的话 直接跑一个下界网络流即可 但是有多个询问 重建图强行跑不行

反过来考虑,变成至多能删除多少边则建边[s,i,degree[i]-Mindegree] [i,T,degree[i]-Mindegree] [u,v,1]

这样跑出来的流 二分图中没有流量的边代表是要选的 有流量的是要删的 同时保证了每个点的度数不小于Mindegree

则接下来每次对与S,T相连的边容量++ 得到k=[0~Mindegree-1]的答案

#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int MAXM = ;
const int INF = ;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << ], nxt[MAXM << ], f[MAXM << ], ed = , S, T;
inline void addedge(int u, int v, int cap)
{
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
f[ed] = cap;
to[++ed] = u;
nxt[ed] = Head[v];
Head[v] = ed;
f[ed] = ;
return;
}
inline bool BFS()
{
int u;
memset(lev, -, sizeof(lev));
queue<int>q;
lev[S] = ;
q.push(S);
while (q.size()) {
u = q.front();
q.pop();
for (int i = Head[u]; i; i = nxt[i])
if (f[i] && lev[to[i]] == -) {
lev[to[i]] = lev[u] + ;
q.push(to[i]);
/*
if (to[i] == T)
{
return 1;
}
magic one way optimize
*/
}
}
memcpy(cur, Head, sizeof Head);
return lev[T] != -;
}
inline int DFS(int u, int maxf)
{
if (u == T || !maxf) {
return maxf;
}
int cnt = ;
for (int &i = cur[u], tem; i; i = nxt[i])
if (f[i] && lev[to[i]] == lev[u] + ) {
tem = DFS(to[i], min(maxf, f[i]));
maxf -= tem;
f[i] -= tem;
f[i ^ ] += tem;
cnt += tem;
if (!maxf) {
break;
}
}
if (!cnt) {
lev[u] = -;
}
return cnt;
}
int Dinic()
{
int ans = ;
while (BFS()) {
ans += DFS(S, );
}
return ans;
}
void init(int SS, int TT)
{
memset(Head, , sizeof(Head));
ed = ;
S = SS;
T = TT;
return;
}
int du[];
int ans[][];
int main()
{
int n1, n2, m;
int u, v;
scanf("%d %d %d", &n1, &n2, &m);
int n = n1 + n2;
for (int i = ; i <= m; i++) {
scanf("%d %d", &u, &v);
addedge(u, v + n1, );
du[u]++, du[v + n1]++;
}
int Mindegree = INT_MAX;
for (int i = ; i <= n; i++) {
Mindegree = min(Mindegree, du[i]);
}
S = , T = n + ;
for (int i = ; i <= n1; i++) {
addedge(S, i, du[i] - Mindegree);
}
for (int i = n1 + ; i <= n; i++) {
addedge(i, T, du[i] - Mindegree);
}
int ansnow = Dinic();
for (int x = ; x <= n1; x++) {
for (int i = Head[x]; i; i = nxt[i]) {
v = to[i];
if (v >= n1 + && v <= n) {
if (f[i] == ) {
ans[Mindegree][++ans[Mindegree][]] = i / ;
}
}
}
}
for (int i = Head[S]; i; i = nxt[i]) {
f[i]++;
}
for (int x = n1 + ; x <= n; x++) {
for (int i = Head[x]; i; i = nxt[i]) {
v = to[i];
if (v == T) {
f[i]++;
}
}
}
for (int i = Mindegree - ; i >= ; i--) {
ansnow = Dinic();
for (int x = ; x <= n1; x++) {
for (int j = Head[x]; j; j = nxt[j]) {
v = to[j];
if (v >= n1 + && v <= n) {
if (f[j] == ) {
ans[i][++ans[i][]] = j / ;
}
}
}
}
for (int j = Head[S]; j; j = nxt[j]) {
f[j]++;
}
for (int x = n1 + ; x <= n; x++) {
for (int j = Head[x]; j; j = nxt[j]) {
v = to[j];
if (v == T) {
f[j]++;
}
}
}
}
for (int i = ; i <= Mindegree; i++) {
printf("%d", ans[i][]);
for (int j = ; j <= ans[i][]; j++) {
printf(" %d", ans[i][j]);
}
puts("");
}
return ;
}

CF 976F 递增容量最大流的更多相关文章

  1. Cogs 731. [网络流24题] 最长递增子序列(最大流)

    [网络流24题] 最长递增子序列 ★★★☆ 输入文件:alis.in 输出文件:alis.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 给定正整数序列x1,-, xn. ( ...

  2. poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10940   Accepted:  ...

  3. poj-1459-最大流dinic+链式前向星-isap+bfs+stack

    title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...

  4. poj 3469 Dual Core CPU【求最小割容量】

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 21453   Accepted: 9297 ...

  5. CF卡技术详解——笔记

    知识太全面了,摘抄摘不完,还是粘过来加上注释和笔记吧. 重点以及断句用加粗,注释用红括号. 一.CF卡技术及规格 一.CF卡技术及规格 1.CF卡简史 随着数码产品的高速普及,近年来闪存卡也进入了高速 ...

  6. [luoguP2762] 太空飞行计划问题(最大权闭合图—最小割—最大流)

    传送门 如果将每一个实验和其所对的仪器连一条有向边,那么原图就是一个dag图(有向无环) 每一个点都有一个点权,实验为收益(正数),仪器为花费(负数). 那么接下来可以引出闭合图的概念了. 闭合图是原 ...

  7. POJ 1273 Drainage Ditches【最大流】

    题意:给出起点是一个池塘,M条沟渠,给出这M条沟渠的最大流量,再给出终点是一条河流,问从起点通过沟渠最多能够排多少水到河流里面去 看的紫书的最大流,还不是很理解,照着敲了一遍 #include< ...

  8. Luogu P3254 圆桌问题(最大流)

    P3254 圆桌问题 题面 题目描述 假设有来自 \(m\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i (i =1,2,--,m)\) . 会议餐厅共有 \(n\) 张餐桌 ...

  9. Luogu 3376 【模板】网络最大流

    0.网络流解释:如果你还是不能理解,我们就换一种说法,假设s城有inf个人想去t城,但是从s到t要经过一些城市才能到达,(以上图为例)其中s到3城的火车票还剩10张,3到t的火车票还剩15张,其他路以 ...

随机推荐

  1. spring中的bean的生命周期

    bean的生命周期:bean的创建 —— 初始化 ——销毁的过程 容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期就会调用我们的方法 在xml配置文件中是在 ...

  2. Bootstrap手风琴悬浮下拉框,直接拷~~~

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. luogu P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles (递推)

    链接:https://www.luogu.org/problemnew/show/P1216 题面: 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的 ...

  4. 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针

    1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...

  5. IDEA Java 源发行版 8 需要目标发行版 1.8

     [问题记录] maven新建的一个项目,需要到一些java8的一些特性,但是在编译的时候就报错了,提示这样的错误. 我是在用二进制字面量出现的这个问题,二进制自变量是Java7的特性, 你可以这样写 ...

  6. idea调试框架时如何能够进入maven依赖包的源码

    最近用idea使用spring security做登录与权限控制,在调试过程中碰到问题,经常需要断点追踪源码,深入查看其中问题.但是maven中引用的包,进入后都是.class文件,非源码.导致查看时 ...

  7. Netty的学习

    看了几天高并发和NIO 今晚终于要开始学习Netty http://ifeve.com/netty5-user-guide/ Netty实现通信的步骤 1.创建两个NIO线程组,一个专门用于网络事件的 ...

  8. 嵌入式linux第一阶段笔记

    1.虚拟网络编辑器(vm):三种模式:(VMnet0)桥接模式(vm和windows公用同个网络(同个物理端口)),(VMnet1)仅主机模式,(VMnet8)NAT模式(vm连接一个虚拟的路由(WA ...

  9. 怎样理解 display:none 和 visibility:hidden

    1. display: none会使元素节点 "消失" , 就像 死亡后灰飞烟灭了. 它是不占位置的. 2. visibility: hidden会使元素节点 "隐藏&q ...

  10. HTTP的请求方法

    . OPTIONS - 获取服务器支持的HTTP请求方法:                     用来检查服务器的性能.如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP O ...