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 ...
随机推荐
- 使用Xcode连接开源中国
故事背景: 今天加入一个新的项目组,其实也就是包括我在内就两个人,由于对方在开源中国上建的项目我没法使用. 所以由我接手第一个任务:就是在开源中国上搭建git项目组 前提条件:xcode和 Git(h ...
- vue 点击倒计时 ajax 封装
方法:function(){ var that = this; if (that.time == 0) { that.disabled = false; that.text ="点击获取&q ...
- python 发送附件
#!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油! #@file: sksendmail.py #@time: 2018/8/20 13:3 ...
- 使用POI循环写入数据时发现只有最后一列有数据
直接说重点: 一般出现在多重(一般是两重)循环,再多几重效率就很低了. 检查调用createRow() 是否在外层循环调用的,如果是在内层循环调用就会出现这个问题,因为程序会不停的重新创建行,直至最后 ...
- Python三元表达式和列表生成式
三元表达式 取代 if …… else……的简单表达方式 # 常规写法 x = 1 y = 2 if x>y: print(x) else: print(y) #三元表达式写法 res ...
- Solr5.0.0 DIH之增量索引
定时索引相关知识 增量更新需要配置个sql(deltaImportQuery.deltaQuery) deltaImportQuery="select * where id='${dih.d ...
- Android自动化测试Uiautomator--UiDevice接口简介
Uiautomator主要分为UiDevice, UiObject, UiScrollable, UiSelector, UiCollection几个类. getUiDevice()方法可以得到一个U ...
- RHEL6.5上升级OpenSSH7.4p1
由于升级OpenSSH涉及到安全性问题,为保险起见,在升级前最好安装telnet服务作为备用方案,然后在升级成功后再停止telnet即可. 一.OpenSSH升级相关源码包下载地址 zlib htt ...
- JMeter安装JSON Path Extractor插件
下载地址:https://jmeter-plugins.org/wiki/PluginsManager/ 先下载jmeter-plugins-manager-1.3.jar,点击下图中的JAR fil ...
- 【PL/SQL编程基础】
[PL/SQL编程基础]语法: declare 声明部分,例如定义变量.常量.游标 begin 程序编写,SQL语句 exception 处理异常 end: / 正斜杠表示执行程序快范例 -- Cre ...