【传送门】https://nanti.jisuanke.com/t/31447

【题目大意】:有一个二分图,问能不能找到它的一个子图,使得这个子图中所有点的度数在区间【L,R】之内。

【题解】首先我们分这几种情况讨论:

(1)如果集合U,V中存在某个点,它的度数小于L,那么肯定就不满足题意,直接输出No。所以对任意i, degree[i] >= L

(2)如果集合U,V中所有点的度数都在给定区间内,直接输出Yes。

(3)如果集合U,V中存在某些点的度数大于R,则需要减少与它关联的边,直到它的度数小于等于R

那么如何删边呢?我们把某个度数过大的点X的所有终点放入优先队列中,这个队列根据点的度数排好序,度数大的点Y在队首,当X的度数大于R时,我们取出队首Y,如果Y度数大于L,代表可以删边,X,Y的度数均自减1。

如果X的度数大于R时,队首Y的度已经不能再减(已经小于等于L了),那么就表明找不到这样的子图,输出No。

把所有的点都按照上述过程扫一遍,看中途是不是会判定找不到这样的子图。

时间复杂度:O(N*LogN)

有网上题解说可以使用网络流,暂时记下以后再探讨。

【AC代码】

#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = ;
vector<int> G[maxn];//存图
int offset = ;//两个集合标号都从1开始为了区分设置一个偏移量,右边的序号都加上偏移量
int degree[maxn];//存度数 // 自定义优先级 按度优先
struct cmp
{
bool operator()(const int &t1,const int &t2)
{
return degree[t1] < degree[t2];
}
}; //初始化
void init(){
memset(degree , , sizeof degree);
for(int i=; i<maxn; i++) G[i].clear();
} int main(){
int n,m,k;
int l,r;
int u,v;
int ca = ;
while(scanf("%d %d %d", &n,&m,&k) != EOF){
init();
int flag = ;
scanf("%d %d",&l, &r);
//建图,记录度数
for(int i=; i<=k; i++){
scanf("%d %d",&u, &v);
G[u].push_back(v+offset);
G[v+offset].push_back(u);
degree[u]++;
degree[v+offset]++;
}
//只要有一个点度数小于L就GG
for(int i= ; i<=n; i++){
// cout<<" "<<degree[i]<<endl;
if(degree[i] < l){
flag = ;
break;
}
}
for(int i=+offset; i<=m+offset; i++){
// cout<<" "<<degree[i]<<endl;
if(degree[i] < l){
flag = ;
break;
}
}
if(!flag){
printf("Case %d: No\n" , ca++);
continue;
} //开始执行步骤(3) 对左边集合所有点 删边减度
for(int i=; i<=n; i++){
if(flag == ) break; priority_queue<int,vector<int>,cmp> q; //定义优先队列
while(!q.empty()) q.pop(); //对每一个点X的终点入队等待删边
for(int j=; j<G[i].size(); j++){
q.push(G[i][j]);
}
//只要这个点 X的度数大于R必须删边减度
while(degree[i] > r){
int f = ;
//取出队首
int tp = q.top();
int t = degree[tp];
q.pop();
if(t- >= l){
f = ;
degree[tp] --;
degree[i]--; }else{
f = ;
}
if(degree[tp] >= l+)
q.push(tp);
if(f == ){
flag = ;
break;
}
}
} //一样的操作,对右边集合
for(int i=+offset; i<=m+offset; i++){
if(flag == ) break;
priority_queue<int,vector<int>,cmp> q;
while(!q.empty()) q.pop(); for(int j=; j<G[i].size(); j++){
q.push(G[i][j]);
} while(degree[i] > r){
int f = ;
int tp = q.top();
int t = degree[tp];
q.pop();
if(t- >= l){
f = ;
degree[tp] --;
degree[i]--; }
if(degree[tp] >= l+)
q.push(tp);
if(f == ){
flag = ;
break;
}
}
} ///最终判定
if(flag) printf("Case %d: Yes\n" , ca++);
else printf("Case %d: No\n" , ca++); }
}

2018 ICPC 沈阳网络预赛 Fantastic Graph (优先队列)的更多相关文章

  1. 2018 ICPC 沈阳网络赛

    2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...

  2. 2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)

    [传送门]https://nanti.jisuanke.com/t/31452 [题目大意]:给定一个数字(最大可达10100),现在要求不超过它的最大超级质数.超级质数定义:对于一个数,把它看成数字 ...

  3. 2018 ICPC 徐州网络预赛 Features Track (STL map pair)

    [传送门]https://nanti.jisuanke.com/t/31458 [题目大意]有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y).两个特征相同当且仅当他们在不同的帧中出现且向 ...

  4. ACM-ICPC 2018 南京赛区网络预赛 J.sum

    A square-free integer is an integer which is indivisible by any square number except 11. For example ...

  5. ACM-ICPC 2018 南京赛区网络预赛 E题

    ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...

  6. ACM-ICPC 2018 南京赛区网络预赛B

    题目链接:https://nanti.jisuanke.com/t/30991 Feeling hungry, a cute hamster decides to order some take-aw ...

  7. ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)

    There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...

  8. ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)

    God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...

  9. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

随机推荐

  1. NoSuchBeanDefinitionException: No qualifying bean of type 'com.bj186.ssm.mapper.EmployeeMapper' available: expected at least 1 bean which qualifies as autowire candidate

    在搭建SSM spring springmvc  mybatis整合的时候, 遇到了这个问题 说说我的问题吧!我在进行单元测试的时候,出现了这个错误,网上一查才知道是,配置文件中没有写扫描包信息.一看 ...

  2. rocketmq 命令示例

    http://www.360doc.com/content/16/0111/17/1073512_527143896.shtml http://www.cnblogs.com/marcotan/p/4 ...

  3. iOS 高效 Mac 配置

    https://testerhome.com/topics/3045 https://support.apple.com/zh-cn/HT201236

  4. C#获得DataTable的key值

    //获得dataTable的key值 List<string> keyList = new List<string>(); ; i < dt.Columns.Count; ...

  5. Web开发面临的挑战主要有哪些?

    摘要:要成为一名高效的Web开发者,这需要我们做很多工作,来提高我们的工作方式,以及改善我们的劳动成果.而在开发中难免会遇到一些困难,从前端到后端. 导读:要成为一名高效的Web开发者,这需要我们做很 ...

  6. 洛谷 P1214 等差数列

    https://www.luogu.org/problemnew/show/P1214 首先暴力枚举可以凑出来的数,对于每个数进行标记. 对于每一个等差数列,当我们知道前两个数后即可以得出整个序列,那 ...

  7. [LUOGU] P1111 修复公路

    题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...

  8. GIMP用Path作画了解一下

    先准备好Path的底稿,只是实验学到的东西,粗糙了点.Paint through the Path,顾名思义,就是沿着Path作画: 1/如果选择的是Stroke line,可以根据自己的喜好,调节S ...

  9. laravel模型关联与列表展示

    上面这个是一个模型关联的图,其实我们很容易去理解 比如说,一对一,也就是说一个用户对应的是一个手机号. 一对多,比如说一篇文章可以有多条评论 一对多反向:如一篇文章可以有多条评论,但对应每条评论也只针 ...

  10. Django中模板查找路径配置