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只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- iOS程序员如何提升核心竞争力,防止自己被裁员?
前言: 核心竞争力最早由普拉哈拉德和加里·哈默尔两位教授提出,通常认为核心竞争力,即企业或个人相较于竞争对手而言所具备的竞争优势与核心能力差异,说白了就是你的优势,而且最好是独一无二的的优势,这就是核 ...
- Java面试题-基础篇三(干货)
这些JAVA基础题确定都会了吗? 31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可 ...
- 基于SpringBoot从零构建博客网站 - 新增创建、修改、删除专栏功能
守望博客是支持创建专栏的功能,即可以将一系列相关的文章归档到专栏中,方便用户管理和查阅文章.这里主要讲解专栏的创建.修改和删除功能,至于专栏还涉及其它的功能,例如关注专栏等后续会穿插着介绍. 1.创建 ...
- webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)
3D图库框架范围与示例 摘要: 为实现企业80%以上的生产数据进行智能转化,在烟草.造纸.能源.电力.机床.化肥等行业,赢得领袖企业青睐,助力企业构建AI赋能中心,实现智能化转型升级.“远舢文龙数据处 ...
- 微信小程序的尺寸单位rpx介绍
rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应. 规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375 ...
- 入门MySQL——架构篇
前言: 上篇文章我们介绍了入门MySQL的基本概念,看完上篇文章,相信你应该了解MySQL的前世今生了吧.本篇文章将带你从架构体系来学习MySQL.我认为学习MySQL架构体系应该是入门阶段必须的, ...
- .Net集合详解
前言 前面几篇文章讲了泛型.讲了数组,都有提到集合,这一节重点对集合进行详细解说.本文主要使用各种集合类型.以至于评估其性能,针对不同的场景选择不同的集合使用. 集合分类详解 一.列表 列表的创建 v ...
- Spring JdbcTemplate之使用详解
最近在项目中使用到了 Spring 的 JdbcTemplate, 中间遇到了好多坑, 所以花一些时间对 JdbcTemplate 的使用做了一个总结, 方便以后自己的查看.文章中贴出来的API都是经 ...
- vue前后分离项目部署(不同端口号,nginx反向代理解决跨域问题)
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- 大型系列课程之-七夕告白之旅Electron篇
上一篇分享了一下vbs的撩妹攻略,但细心的兄弟会发现,这种脚本式的攻城方案并不得心应手,有很多妹子害怕是病毒根本不敢点击,而且这个脚本界面风格也不漂亮,不能轻易打动妹子的心,怎么破,小编这次在为各位老 ...