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

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int nu, nv, n, m, ss, tt, hea[4005], deg[4005], cnt, maxFlow, lev[4005], cur[4005];
const int oo=0x3f3f3f3f;
queue<int> d;
vector<int> vec[4005];
struct Edge{
int too, nxt, val;
}edge[50005], orz[2005];
void add_edge(int fro, int too, int val){
edge[cnt].nxt = hea[fro];
edge[cnt].too = too;
edge[cnt].val = val;
hea[fro] = cnt++;
}
void addEdge(int fro, int too, int val){
add_edge(fro, too, val);
add_edge(too, fro, 0);
}
bool bfs(){
memset(lev, 0, sizeof(lev));
lev[ss] = 1;
d.push(ss);
while(!d.empty()){
int x=d.front();
d.pop();
for(int i=hea[x]; i!=-1; i=edge[i].nxt){
int t=edge[i].too;
if(!lev[t] && edge[i].val>0){
lev[t] = lev[x] + 1;
d.push(t);
}
}
}
return lev[tt]!=0;
}
int dfs(int x, int lim){
if(x==tt) return lim;
int addFlow=0;
for(int &i=cur[x]; i!=-1; i=edge[i].nxt){
int t=edge[i].too;
if(lev[t]==lev[x]+1 && edge[i].val){
int tmp=dfs(t, min(lim-addFlow, edge[i].val));
edge[i].val -= tmp;
edge[i^1].val += tmp;
addFlow += tmp;
if(addFlow==lim) break;
}
}
return addFlow;
}
void dinic(){
while(bfs()){
for(int i=ss; i<=tt; i++) cur[i] = hea[i];
maxFlow += dfs(ss, oo);
}
}
int main(){
memset(hea, -1, sizeof(hea));
cin>>nu>>nv>>m;
n = nu + nv;
ss = 0; tt = n + 1;
int minDeg=0x3f3f3f3f;
for(int i=1; i<=m; i++){
scanf("%d %d", &orz[i].too, &orz[i].nxt);
orz[i].nxt += nu;
deg[orz[i].too]++;
deg[orz[i].nxt]++;
}
for(int i=1; i<=n; i++)
minDeg = min(minDeg, deg[i]);
for(int i=1; i<=nu; i++)
addEdge(ss, i, deg[i]-minDeg-1);
for(int i=1; i<=nv; i++)
addEdge(nu+i, tt, deg[nu+i]-minDeg-1);
int tmp=cnt;
for(int i=1; i<=m; i++)
addEdge(orz[i].too, orz[i].nxt, 1);
for(int i=minDeg; i>=0; i--){
for(int j=0; j<tmp; j+=2)
edge[j].val++;
dinic();
for(int j=tmp; j<cnt; j+=2)
if(edge[j].val)
vec[i].push_back((j-tmp)/2+1);
}
for(int i=0; i<=minDeg; i++){
printf("%d ", vec[i].size());
for(int j=0; j<vec[i].size(); j++)
printf("%d ", vec[i][j]);
printf("\n");
}
return 0;
}

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. cf314E. Sereja and Squares(dp)

    题意 题目链接 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种,用除x之外的小写字母a~z表示.求有多少种合法的括号序列.答案对4294967296取模.合法序列不能相交,如()[],( ...

  2. base、self标签

    以新的窗口打开页面 self在自己的窗口打开

  3. WPF样式学习:ToolBar的使用

    隐藏拖动把手: 设置ToolBar属性 ToolBarTray.IsLocked="True",可以达到隐藏拖动把手的目的 private void ToolBar_Loaded( ...

  4. 《Python高效开发实战》实战演练——开发Django站点1

    6.2 实战演练:开发Django站点 用Django开发网站需要遵循Django的一套开发流程.本节通过建立一个消息录入页面演示Django的开发流程及相关技术. 6.12.1  建立项目 在进行D ...

  5. python decorator 用法

    https://www.zhihu.com/question/31265857 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html ...

  6. Java反序列化漏洞详解

      Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...

  7. cms-数据库设计

    业务相关的3张表 1.类型表: CREATE TABLE `t_arctype` (`id` int(11) NOT NULL AUTO_INCREMENT,//id`typeName` varcha ...

  8. IOS 创建一个可以随意拉伸不变形的图片

    创建一个扩展 UIImage的类 #import "UIImage_Extension.h" @implementation UIImage+Extension /** *返回一张 ...

  9. C#做项目时的一些经验分享

    1.对于公用的类型定义,要单独抽取出来,放到单独的DLL中. 2.通过大量定义interface接口,来提高模块化程度,不同功能之间通过实现接口来面向接口编程. 3.如果项目中存在很多非常相似,但是又 ...

  10. Python02 变量

    变量 因为Python是弱变量类型编程语言,所以变量赋值不需要类型声明. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 变量 ...