枚举 \(k\),对于每个点 \(i\) 我们最多删 \(deg_i-k\) 条边,就源点向第一部、第二部向汇点连边,容量是 \(deg_i-k\),原边连上,容量是 \(1\),这样每流过一条原边在网络流图中的边时,就代表这条边可以删掉。也即没有流过的边就是 \(k\) 时的答案

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <queue>
  6. using namespace std;
  7. int nu, nv, n, m, ss, tt, hea[4005], deg[4005], cnt, maxFlow, lev[4005], cur[4005];
  8. const int oo=0x3f3f3f3f;
  9. queue<int> d;
  10. vector<int> vec[4005];
  11. struct Edge{
  12. int too, nxt, val;
  13. }edge[50005], orz[2005];
  14. void add_edge(int fro, int too, int val){
  15. edge[cnt].nxt = hea[fro];
  16. edge[cnt].too = too;
  17. edge[cnt].val = val;
  18. hea[fro] = cnt++;
  19. }
  20. void addEdge(int fro, int too, int val){
  21. add_edge(fro, too, val);
  22. add_edge(too, fro, 0);
  23. }
  24. bool bfs(){
  25. memset(lev, 0, sizeof(lev));
  26. lev[ss] = 1;
  27. d.push(ss);
  28. while(!d.empty()){
  29. int x=d.front();
  30. d.pop();
  31. for(int i=hea[x]; i!=-1; i=edge[i].nxt){
  32. int t=edge[i].too;
  33. if(!lev[t] && edge[i].val>0){
  34. lev[t] = lev[x] + 1;
  35. d.push(t);
  36. }
  37. }
  38. }
  39. return lev[tt]!=0;
  40. }
  41. int dfs(int x, int lim){
  42. if(x==tt) return lim;
  43. int addFlow=0;
  44. for(int &i=cur[x]; i!=-1; i=edge[i].nxt){
  45. int t=edge[i].too;
  46. if(lev[t]==lev[x]+1 && edge[i].val){
  47. int tmp=dfs(t, min(lim-addFlow, edge[i].val));
  48. edge[i].val -= tmp;
  49. edge[i^1].val += tmp;
  50. addFlow += tmp;
  51. if(addFlow==lim) break;
  52. }
  53. }
  54. return addFlow;
  55. }
  56. void dinic(){
  57. while(bfs()){
  58. for(int i=ss; i<=tt; i++) cur[i] = hea[i];
  59. maxFlow += dfs(ss, oo);
  60. }
  61. }
  62. int main(){
  63. memset(hea, -1, sizeof(hea));
  64. cin>>nu>>nv>>m;
  65. n = nu + nv;
  66. ss = 0; tt = n + 1;
  67. int minDeg=0x3f3f3f3f;
  68. for(int i=1; i<=m; i++){
  69. scanf("%d %d", &orz[i].too, &orz[i].nxt);
  70. orz[i].nxt += nu;
  71. deg[orz[i].too]++;
  72. deg[orz[i].nxt]++;
  73. }
  74. for(int i=1; i<=n; i++)
  75. minDeg = min(minDeg, deg[i]);
  76. for(int i=1; i<=nu; i++)
  77. addEdge(ss, i, deg[i]-minDeg-1);
  78. for(int i=1; i<=nv; i++)
  79. addEdge(nu+i, tt, deg[nu+i]-minDeg-1);
  80. int tmp=cnt;
  81. for(int i=1; i<=m; i++)
  82. addEdge(orz[i].too, orz[i].nxt, 1);
  83. for(int i=minDeg; i>=0; i--){
  84. for(int j=0; j<tmp; j+=2)
  85. edge[j].val++;
  86. dinic();
  87. for(int j=tmp; j<cnt; j+=2)
  88. if(edge[j].val)
  89. vec[i].push_back((j-tmp)/2+1);
  90. }
  91. for(int i=0; i<=minDeg; i++){
  92. printf("%d ", vec[i].size());
  93. for(int j=0; j<vec[i].size(); j++)
  94. printf("%d ", vec[i][j]);
  95. printf("\n");
  96. }
  97. return 0;
  98. }

cf976f Minimal k-covering的更多相关文章

  1. 【满k叉树】Perfect Tree

    题目描述 Given a positive integer k, we define a rooted tree to be k-perfect, if and only if it meets bo ...

  2. ACM算法整理(不断补充ing)

    动态规划 1.背包问题 (1)01背包 ,n) DFR(v,V,C[i]) F[v]=max(F[v],F[v-C[i]]+W[i]); } //初始化时 //若背包不一定装满F全初始化为0 //若装 ...

  3. hdoj1150(最小点覆盖)

    题意: 两台机器,A台机器有N种模式,B台机器有M种不同的模式,初始模式都是0 以及K个需要运行的任务(i,x,y),在A台机器是x模式,在B台机器是y模式. 请合理为每个任务安排一台机器并合理安排顺 ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. cdoj第13th校赛初赛F - Fabricate equation

    http://acm.uestc.edu.cn/#/contest/show/54 F - Fabricate equation Time Limit: 3000/1000MS (Java/Other ...

  6. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

  7. 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

    议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...

  8. [LeetCode] 632. Smallest Range Covering Elements from K Lists 覆盖K个列表元素的最小区间

    You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...

  9. 2012Chhengdu K - Yet Another Multiple Problem

    K - Yet Another Multiple Problem Time Limit:20000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

随机推荐

  1. Educational Codeforces Round 51 (Rated for Div. 2)

    做了四个题.. A. Vasya And Password 直接特判即可,,为啥泥萌都说难写,,,, 这个子串实际上是忽悠人的,因为每次改一个字符就可以 我靠我居然被hack了???? %……& ...

  2. Vue系列(1):单页面应用程序

    前言:关于页面上的知识点,如有侵权,请看 这里 . 关键词:SPA.单个 HTML 文件.全靠 JS 操作.Virtual DOM.hash/history api 路由跳转.ajax 响应.按需加载 ...

  3. 微信公众平台网页开发实战--3.利用JSSDK在网页中获取地理位置(HTML5+jQuery)

    复制一份JSSDK环境,创建一份index.html文件,结构如图7.1所示. 图7.1  7.1节文件结构 在location.js中,封装“getLocation”接口,如下: 01 wxJSSD ...

  4. freebsd为网卡设置别名

    ifconfig em0 172.16.21.5 netmask 255.255.255.0 alias

  5. c++树的表示方法

    c++树的节点的表示方法: typedef struct Node *Tree; struct Node { int data; Node *left; Node *right; int flag; ...

  6. [转载]AngularJS入门教程03:迭代器

    我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视 ...

  7. empty、isset、is

    直接上代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php $a=0; $b='0'; $c=0.0; ...

  8. Linux学习记录(二)

    1.远程连接工具的使用 实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH ...

  9. PAT 乙级 1017

    题目 题目地址:PAT 乙级 1017 题解 粗看是一道大数除法题,实际上只不过是通过字符数组模拟除法过程,理解之后还是比较简单的: 具体分析一下本题: 因为题设中的除数(n)是一位整数,因此大幅简化 ...

  10. Windows10系统下查看mysql的端口号并修改

    mysql的端口号默认是3306,初学者可能有时会忘记或者之前修改了默认的端口号,忘记了,或者很多时候我们一台电脑需要安装两个mysql或者想设置一个自己的喜欢的数字,那么接下来我们来看看如何查看或者 ...