Description

给你一张左边 \(n_1\) 个点,右边 \(n_2\) 个点, \(m\) 条边的二分图。对于每一个 \(0\le k\le minDeg\) ,求选取哪些边可以使每个点的度数都不小于 \(k\) 。

\(1\le n_1,n_2\le 2000\) , \(m\le 2000\)

Solution

大力建模谁都会系列,多组询问会炸。

于是建边就建流量为 \(deg[i]-k\) 的边,每次增加流量即可。

#include<bits/stdc++.h>
using namespace std;template <class T> inline void read(T &x) {x = 0; static char ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar());for (; ch >= '0' && ch <= '9'; ch = getchar()) (x *= 10) += ch - '0';
}#define N 5001
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define INF 0x3f3f3f3fint S, T, head[N], cur[N], tot = 1, q[N], dep[N];
struct edge { int v, c, next; }e[100001];
inline void insert(int u, int v, int c) { e[++tot].v = v, e[tot].c = c, e[tot].next = head[u]; head[u] = tot; }
inline void add(int u, int v, int c) { insert(u, v, c), insert(v, u, 0); }
inline bool bfs() {memset(dep, 0, sizeof dep); dep[S] = 1;int l = 1, r = 1; q[1] = S;while (l <= r) {int u = q[l++];for (int i = head[u], v; i; i = e[i].next) if (e[i].c && !dep[v = e[i].v]) {dep[v] = dep[u] + 1, q[++r] = v;if (!(v ^ T)) return 1;}}return 0;
}
int dfs(int u, int dist) {if (u == T) return dist;int ret = 0;for (int &i = head[u], v; i; i = e[i].next) if (dep[v = e[i].v] == dep[u] + 1 && e[i].c) {int d = dfs(v, min(dist - ret, e[i].c));e[i].c -= d, e[i ^ 1].c += d, ret += d;if (ret == dist) return dist;}if (!ret) dep[u] = -1;return ret;
}
inline void cpy() { rep(i, S, T) cur[i] = head[i]; }
inline void rec() { rep(i, S, T) head[i] = cur[i]; }
int dinic() { int ret = 0; cpy(); while (bfs()) ret += dfs(S, INF), rec(); return ret; }int nu, nv, n, m, deg[N], minDeg = INF;
vector<int> ans[N];
struct Data { int u, v; }a[N];int main() {read(nu), read(nv), read(m), n = nu + nv, T = n + 1;rep(i, 1, m) read(a[i].u), read(a[i].v), a[i].v += nu, deg[a[i].u]++, deg[a[i].v]++;rep(i, 1, n) minDeg = min(minDeg, deg[i]);rep(i, 1, nu) add(S, i, deg[i] - minDeg - 1);rep(i, nu + 1, n) add(i, T, deg[i] - minDeg - 1);int tmp = tot;rep(i, 1, m) add(a[i].u, a[i].v, 1);for (int i = minDeg; i >= 0; i--) {for (int j = 2; j <= tmp; j += 2) e[j].c++;dinic();for (int j = tmp + 1; j <= tot; j += 2) if (e[j].c) ans[i].push_back((j - tmp + 1) / 2);}rep(i, 0, minDeg) {printf("%d ", ans[i].size());for (auto y : ans[i]) printf("%d ", y);puts("");}return 0;
}

转载于:https://www.cnblogs.com/aziint/p/9191660.html

CodeForces - 976F Minimal k-covering相关推荐

  1. CodeForces - 1579G Minimal Coverage(dp)

    题目链接:点击查看 题目大意:给出 nnn 个长度不同的木棍.设第 i−1i-1i−1 次放置木棍后的终点为 xxx,那么第 iii 个木棍有且仅有两种放置方法: 放到 [x+1,x+a[i]][x+ ...

  2. Codeforces 825E - Minimal Labels

    825E - Minimal Labels 题意 给出 m 条有向边,组成有向无环图,输出一个 1 到 n 组成的排列,每个数只能出现一次,表示每个点的标号.如果有边 \((u, v)\) 那么 \( ...

  3. Codeforces 1175E Minimal Segment Cover 倍增

    Minimal Segment Cover 嗯嗯嗯.. 打倍增的时候两个for写反了查了半天bug... 我们先把没用的线段去掉, 然后对每个线段都找到和它接触的r最大的作为下一个, 然后打倍增就好了 ...

  4. Codeforces 976F

    题意略. 思路:为了保证每个点都有至少k条边覆盖,我们可以让二分图的左半边与源点s相连,连容量为indegree[i] - k的边(如果正着想不好想,我们可以想它的反面, 限制它反面的上限,从而保证我 ...

  5. CodeForces - 1328F Make k Equal(模拟)

    题目链接:点击查看 题目大意:给出一个数列 a ,现在有两种操作: 找到一个最小值,使其值加一 找到一个最大值,使其值减一 注意这里找到一个最值进行的操作,是针对最值不唯一的情况,题目问至少需要进行多 ...

  6. CodeForces 797C Minimal string

    栈. 先处理一下后缀最小值. 对于每一个字符,如果不是后缀最小值,将栈顶小于当前后缀最小值的都弹出,然后压入当前字符. 如果是后缀最小值,将栈顶小于当前后缀最小值的都弹出,再输出该字符. #inclu ...

  7. Codeforces 797C Minimal string【贪心】

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后. 2.把t字符串最后一个字符转移到u字符串最后. 最后要求s.t字符串都为空,问u ...

  8. Codeforces Gym 101173 K. Key Knocking (构造)

    题意 对于给定的长为 3×N3\times N 的 01 字符串 S,求在最多变换 N 次下使得字符串 S 的 weight >= 2n . 字符串的 weight 为 相邻不同字符的个数 + ...

  9. Codeforces 1579G

    Codeforces 1579G. Minimal Coverage 传送门 题目大意 有 n 根棍子,每根棍子有头有尾,长度不一.第一根棍子的尾巴放置在一维坐标轴 0 的位置,第二根棍子棍尾紧挨着第 ...

最新文章

  1. Docker(二):Docker 容器使用
  2. my25_Mysql操作技巧汇总
  3. 胆固醇竟是新冠最隐蔽同伙!协助病毒入侵细胞,普林斯顿、哈佛医学院首次观察到全过程...
  4. 日记:2019-07-28
  5. mfc控件位置随对话框窗口移动
  6. 刘强东夫妇向英国捐赠大量防疫物资:在英华侨及留学生可免费认领
  7. Win7 64位系统安装 Windows XP 虚拟机
  8. 数据包络分析-BCC模型
  9. A1,A2,A3,A4,A5,A6,A7,A8纸张大小图解
  10. Win10环境下运行红色警戒等老款游…
  11. 微处理器和由微型计算机构成,微处理器的组成
  12. 域服务器无法修改域账户密码,域用户使用Ctrl+Alt+del不能修改密码
  13. Linux命令行下设置黑底绿字
  14. MC服务器启动脚本写法
  15. 如何自学?Android开发学习路线指南,最详资料解析
  16. android sqlite fts4,FTS4 sqlite MATCH查询不起作用(FTS4 sqlite MATCH query not working)
  17. Spring笔记通俗易懂版
  18. 如何用python做考勤_【python爬虫教程 考勤】如何用Python实现一只小爬虫,爬取拉勾网...
  19. Windows 同时开启核心显卡与独立显卡(不接显示器启动核芯显卡)
  20. python 下列表达式的值为true的是_下列表达式的值为True的是( )。_学小易找答案...

热门文章

  1. Linux下使用g++编译C++程序——Compiling Cpp
  2. open ai gpt_您实际上想尝试的GPT-3 AI发明鸡尾酒
  3. 编程基本功:有了范例代码,怎么办?
  4. 半年内使用两次借呗就没法申请房贷?
  5. Visual Studio 2008 Beta 2 VPC寿命延长
  6. sql server numeric 可存几位小数_想成为优秀SQL高手?你就差这些细节
  7. gridlayoutmanager 设置间距_不设置主灯的客厅应当如何保证较好的灯光分布?
  8. 微信无法连接到服务器(110087)),110087无法连接网络是什么意思
  9. 【TensorFlow-windows】keras接口——BatchNorm和ResNet
  10. MKL学习——基本操作C++实现