2018 ICPC 沈阳网络预赛 Fantastic Graph (优先队列)
【传送门】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 (优先队列)的更多相关文章
- 2018 ICPC 沈阳网络赛
2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...
- 2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)
[传送门]https://nanti.jisuanke.com/t/31452 [题目大意]:给定一个数字(最大可达10100),现在要求不超过它的最大超级质数.超级质数定义:对于一个数,把它看成数字 ...
- 2018 ICPC 徐州网络预赛 Features Track (STL map pair)
[传送门]https://nanti.jisuanke.com/t/31458 [题目大意]有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y).两个特征相同当且仅当他们在不同的帧中出现且向 ...
- ACM-ICPC 2018 南京赛区网络预赛 J.sum
A square-free integer is an integer which is indivisible by any square number except 11. For example ...
- ACM-ICPC 2018 南京赛区网络预赛 E题
ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...
- ACM-ICPC 2018 南京赛区网络预赛B
题目链接:https://nanti.jisuanke.com/t/30991 Feeling hungry, a cute hamster decides to order some take-aw ...
- ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)
There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...
- 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 ...
- 2018 ICPC 徐州网络赛
2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...
随机推荐
- bootstrap table 保留翻页选中数据
$(function () { $('#exampleTable').on('uncheck.bs.table check.bs.table check-all.bs.table uncheck-al ...
- Spring根据XML配置文件注入对象类型属性
这里有dao.service和Servlet三个地方 通过配过文件xml生成对象,并注入对象类型的属性,降低耦合 dao文件代码: package com.swift; public class Da ...
- 【数学 裴蜀定理】bzoj2257: [Jsoi2009]瓶子和燃料
使gcd最大的trick Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy的飞船上共有 N ...
- [JOY]1143 飘飘乎居士的约会
题目描述 又是美妙的一天,这天飘飘乎居士要和MM约会,因此他打扮的格外帅气.但是,因为打扮的时间花了太久,离约会的时间已经所剩无几. 幸运的是,现在飘飘乎居士得到了一张nm的地图,图中左上角是飘飘乎居 ...
- 如何用纯 CSS 创作阶梯文字特效
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MXYBEM 可交互视频教 ...
- Taro:使用taro完成小程序开发
前言:taro是一个可以很好实现一次开发,多端统一的框架,本文只介绍它小程序端开发的一些内容.小程序项目搭建gitup已经有很清楚的说明:https://github.com/NervJS/taro ...
- Python列表,元组,字典,集合详细操作
菜鸟学Python第五天 数据类型常用操作及内置方法 列表(list) ======================================基本使用====================== ...
- Spring中线程池的使用
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent ...
- STM32中如何对printf函数重定向
通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...
- Java的9种基本数据类型以及封装类
Java的9种基本数据类型以及封装类 基本类型 大小(单位/字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer ...