Codeforces 976F
题意略。
思路:为了保证每个点都有至少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的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- 《C# 语言学习笔记》——C# 简介
1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ...
- vs2013类模板的修改
很多人一起写程序,往往都有规定的代码模板,比如要求每个类都有注释,说明开发者是谁,类的功能以及其他信息.如果每次建一个类,手工去复制这些信息很麻烦,也很容易遗漏.我们可以直接修改VS2013创建类的时 ...
- 第一个C# Winform实例
前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入.VS版本VS2017 1:打开VS建立一个WInform 项目.拉入两个控件,gr ...
- 阅读nopcommerce startup源码
创建一个asp.net core项目,可以到到startup类有两个方法 // This method gets called by the runtime. Use this method to a ...
- div span img对齐,垂直居中对齐问题
我想你们在前端开发中或多或少都遇到过这种问题,文字和图片不能平齐,很是头疼. HTML代码: <div class="">小太阳<span>小太阳</ ...
- Codeforces Round #192 (Div. 2) (330A) A. Cakeminator
题意: 如果某一行没有草莓,就可以吃掉这一行,某一列没有也可以吃点这一列,求最多会被吃掉多少块蛋糕. //cf 192 div2 #include <stdio.h> #include & ...
- 深入理解java内存模型--读书笔记
深入理解java内存模型 java内存模型的抽象 java线程之间的通信由java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见 从抽象的角度来看,JMM决定了线程和主 ...
- git和githup
一:Git简介 1.1:VCS的历史 Git是一款代码管理工具(Version Control System),傲视群雄,是目前世界上最先进的免费开源的分布式版本控制系统,没有之一! VCS版本控制系 ...
- ajax具体实现学习记录
记录自己对ajax\的理解, 首先要明白ajax是为了解决什么问题,简单来讲就是为了局部刷新页面,而不刷新整个界面.就比如现在有一个实时热度的显示,它是不断变化的,所以你肯定要不停的从数据库当中获取热 ...
- linux环境下搭建自动化Jenkins管理工具
一.搭建一个jak--tomcat服务器到自己的linux服务器上 具体的服务器搭建这里可以参考华华大佬的博客:https://www.cnblogs.com/liulinghua90/p/46614 ...