题意略。

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

限制它反面的上限,从而保证我正面k条边的覆盖),让二分图的右半边与汇点t相连,容量同样是indegree[i] - k。然后跑最大流,E - 最大流中用到的边 = 答案。

每次跑完最大流都要重新建图。我的最大流用的是dinic。

详见代码:

#include<bits/stdc++.h>
#define maxn 4005
#define INF 0x3f3f3f3f
using namespace std; struct edge{
int to,cap,rev,id;
edge(int a = ,int b = ,int c = ,int d = ){
to = a,cap = b,rev = c,id = d;
}
}; bool visit[maxn];
int indg[maxn],level[maxn],iter[maxn],n1,n2,m,s,t,store[maxn];
vector<edge> graph[maxn];
vector<edge> standard[maxn]; void add_e(int from,int to,int cap,int id){
graph[from].push_back(edge(to,cap,graph[to].size(),id));
graph[to].push_back(edge(from,,graph[from].size() - ,id));
}
void bfs(int s){
memset(level,-,sizeof(level));
queue<int> que;
level[s] = ;
que.push(s);
while(que.size()){
int v = que.front();
que.pop();
for(int i = ;i < graph[v].size();++i){
edge& e = graph[v][i];
if(e.cap > && level[e.to] < ){
level[e.to] = level[v] + ;
que.push(e.to);
}
}
}
}
int dfs(int v,int t,int f){
if(v == t) return f;
for(int& i = iter[v];i < graph[v].size();++i){
edge& e = graph[v][i];
if(e.cap > && level[v] < level[e.to]){
int d = dfs(e.to,t,min(f,e.cap));
if(d > ){
e.cap -= d;
graph[e.to][e.rev].cap += d;
return d;
}
}
}
return ;
}
int max_flow(int s,int t){
int flow = ;
while(true){
bfs(s);
if(level[t] < ) return flow;
memset(iter,,sizeof(iter));
int f;
while((f = dfs(s,t,INF)) > ){
flow += f;
}
}
} int main(){
scanf("%d%d%d",&n1,&n2,&m);
s = ,t = n1 + n2 + ;
for(int i = ;i < m;++i){
int u,v;
scanf("%d%d",&u,&v);
v += n1;
++indg[u],++indg[v];
standard[u].push_back(edge(v,,standard[v].size(),i + ));
standard[v].push_back(edge(u,,standard[u].size() - ,i + ));
}
int mdg = maxn;
for(int i = ;i <= n1 + n2;++i)
mdg = min(mdg,indg[i]);
printf("0\n");
for(int k = ;k <= mdg;++k){
for(int v = ;v < maxn;++v) graph[v].clear();
for(int i = ;i <= n1 + n2;++i){
for(int j = ;j < standard[i].size();++j)
graph[i].push_back(standard[i][j]);
}
for(int i = ;i <= n1;++i) add_e(s,i,indg[i] - k,-);
for(int i = n1 + ;i <= n1 + n2;++i) add_e(i,t,indg[i] - k,-);
max_flow(s,t);
memset(visit,false,sizeof(visit));
int cnt = ;
for(int i = n1 + ;i <= n1 + n2;++i){
for(int j = ;j < graph[i].size();++j){
edge& e = graph[i][j];
if(e.cap && e.to != t){
visit[e.id] = true;
++cnt;
}
}
}
printf("%d",m - cnt);
for(int i = ;i <= m;++i){
if(!visit[i]) printf(" %d",i);
}
printf("\n");
}
return ;
} /*
1 2 10
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 2
*/

Codeforces 976F的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

随机推荐

  1. Java EE编程思想

    组件--容器 编程思想 组件:由程序员根据特定的业务需求编程实现. 容器:组件的运行环境,为组件提供必须的底层基础功能. 组件通过调用容器提供的标准服务来与外界交互,容器提供的标准服务有命名服务.数据 ...

  2. 如何实现Kali linux系统下的U盘启动(小白指导)

    一.准备工作: 声明:这个“操作”并不会影响你原装的系统,真正的即插即用的哦. (1)4GB的U盘<读写速度比较快的> (2)Kali linux镜像文件 (3)软件Universal-U ...

  3. Intellij IDEA 打开文件tab数量限制的调整

    最近在阅读一个开源项目,发现IDEA对同时打开的文件TAB有限制,最多只能打开10个文件Tab,再多开就会把原来的Tab关闭了. 找了半天,在菜单中找到了调整方法,以Mac为例,调整路径为 “Inte ...

  4. LeetCode: 3 无重复字符的最长子串 (Java)

    3. 无重复字符的最长子串 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 最初始的解 ...

  5. 在 Windows 上搭建 PHP 网站

    PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用.PHP的语法借鉴吸收C语言. ...

  6. QScintilla下载与编译

    你好,我是大贺! Pou光明  大家好,我又回来了~~ 之前和大家分享的是在c/c++中通过python c api嵌入python解释器,主体都是和python相关的.其实最终要和大家分享的是如何做 ...

  7. 第三章、Go-内建容器

    3.1.数组 (1)数组的定义 package main import ( "fmt" ) func main() { //用var定义数组可以不用赋初值 var arr1 [5] ...

  8. 我与微笑哥以及 Java 极客技术的前世今生

    ​关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑 ...

  9. 代码生成java连接数据库的所需代码(超详细)

    开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱 ...

  10. 以太坊RLPx传输协议

    本文主要内容翻译自:The RLPx Transport Protocol,其中添加了一些个人的理解,由于密码学水平有限,不正确之处望指正.另外原文可能已经更新,最新内容请直接阅读原文. 本文档定义了 ...