题意略。

思路:为了保证每个点都有至少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. 探究netty的观察者设计模式

    javadoc笔记点 观察者的核心思想就是,在适当的时机回调观察者的指定动作函数 我们知道,在使用netty创建channel时,一般都是把这个channel设置成非阻塞的模式,这意味着什么呢? 意味 ...

  2. ssm下的CURD

    https://github.com/MenghuiLiu/ssm-curd 以后有更新.... 照着前辈的足迹向前撸

  3. 神奇的 SQL 之 CASE表达式,妙用多多 !

    前言 历史考试选择题:黄花岗起义第一枪谁开的? A宋教仁 B孙中山 C黄兴 D徐锡麟,考生选C. 又看第二题:黄花岗起义第二枪谁开的? 考生傻了,就选了个B. 接着看第三题:黄花岗起义中,第三枪谁开的 ...

  4. 阿里技术面全A,终面却被产品经理拉下马。。。

    大纲: 一.投递简历 二.准备面试 三.技术一面 四.健身房里的技术二面 五.产品经理的死亡三面 六.总结 一.投递简历 找内推.大公司投简历尽量找内推,无论是校招还是社招.校招可以去牛客网或知乎找, ...

  5. 自定义SWT控件三之搜索功能下拉框

    3.搜索功能下拉弹出框 package com.view.control.select; import java.util.ArrayList; import java.util.LinkedList ...

  6. 五、Python基础(2)

    五,Python基础(2) 1.数据类型基础 (一)什么是数据类型? 用于区分变量值的不同类型. (二)为何对数据分类? 针对不同状态就应该用不同类型的数据去标识. (三)数据类型分类 1.数字类型 ...

  7. 基于JaCoCo的Android测试覆盖率统计(二)

    > 本文章是我上一篇文章的升级版本,详见地址:https://www.cnblogs.com/xiaoluosun/p/7234606.html ## 为什么要做这个?1. 辛辛苦苦写了几百条测 ...

  8. 运营商手机视频流量包业务日志ETL及统计分析

    自己做过的项目在这里做一个记录,否则就感觉不是自己的了.一是因为过去时间已经很长了,二是因为当时做得有点粗糙,最后还不了了之了. 话不多说,先大致介绍一下项目背景.以前各大手机视频 App 一般都有运 ...

  9. 【POJ - 3176】牛保龄球 (简单dp)

    牛保龄球 直接中文了 Descriptions 奶牛打保龄球时不使用实际的保龄球.它们各自取一个数字(在0..99范围内),然后排成一个标准的保龄球状三角形,如下所示: 7 3 8 8 1 0 2 7 ...

  10. [转] java开源游戏

    收藏一下   triplea  Triplea是一个开放源码的boardgame.它允许玩家选择各种各样的战略版图游戏(如:轴心国或同盟军).TripleA引擎支持联网对战,支持声音,支持使用XML文 ...