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只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- typedef int a[10];怎么解释?
typedef int a[10]; a b[10]; 为什么分配400个字节的空间? int a[10];为什么分配了40个字节的空间? 问题:应该怎么解释typedef的这种行为呢?而如果换成是# ...
- mysqli_query 的定义和用法
定义和用法 mysqli_query() 函数执行某个针对数据库的查询. 语法 mysqli_query(connection,query,resultmode); 参数 描述 connecti ...
- Uploadify.js引用导致浏览器宽度计算错误,布局混乱
首先,本人新手,高手勿喷,请忽略.谢谢. 今天在写代码的时候遇到一个奇葩问题,我再在页面加载完成以后,动态计算DIV宽度,将整个层铺满浏览器.一切正常.单当我引入jquery.uploadify.js ...
- 基于kubernetes自研容器管理平台的技术实践
一.容器云的背景 伴随着微服务的架构的普及,结合开源的Dubbo和Spring Cloud等微服务框架,宜信内部很多业务线逐渐了从原来的单体架构逐渐转移到微服务架构.应用从有状态到无状态,具体来说将业 ...
- Linux常用命令3
useradd 添加用户账号 -n 制定uid标记号 -d 指定宿主目录,缺省默认为/home/用户名 -e 制定账号失效时间 -M 不为用户建立初始化宿主目录(通常作为不登陆账号) -s 指定用户的 ...
- 2.2.2python的BeautifulSoup库
from bs4 import BeautifulSoupimport rebroken_html = '<ul class="country"><li>A ...
- 仿LookUpEdit多列模糊搜索,功能比GridLookUpEdit强大,比SearhLookUpEdit方便
先上效果图: 控件调用示例:(devexpress使用了16.2.6.0版本,可以根据实际需要进行版本转换) using System; using System.Collections.Generi ...
- Log4Net 配置日志按日期和日志级别分类写入
配置效果图: 配置代码: <?xml version="1.0" encoding="utf-8" ?> <log4net> <! ...
- 完美解决windows10磁盘占用100%并出现卡顿、假死无反应
完美解决windows10磁盘占用100%并出现卡顿.假死无反应 想必大家也跟我一样,自从用win10系统以后经常会出现这种情况:磁盘突然占用100%然后开始出现假死现象,电脑卡住,点击任何软件没反应 ...
- 为什么阿里Java规约禁止使用Java内置线程池?
IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...