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 ...
随机推荐
- 选择法数组排序参考(Java)
package com.swift; public class Xuanze { public static void main(String[] args) { int[] arr= {28,2,3 ...
- IP数据包的校验和算法
1.算法思路: IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算IP数据包的校验和.应该按如下步骤: (1)把IP数据包的校验和字段置为0: ( ...
- git 不完全教程
概念 工作目录:当前所见,Working directory 暂存区域:以后要提交到仓库的文件,称为Index或者staging area Git 仓库:持久化存储快照的地方,HEAD指针所指向的地方 ...
- (2)zabbix硬件需求
1. 硬件需求 无非就是cpu.内存.硬盘之类的1.1 CPU由你的zabbix数据库使用情况来做决定,如果你监控的项目越多,那你的cpu要越好.具体多好,下面有个表格 1.2 内存与硬盘最基本的需求 ...
- Python基础:字典(dict)与集合(set)
查找场景下与列表的性能对比 字典与集合之所以高效的原因是:内部结构都是一张哈希表. 平均情况下插入.查找和删除的时间复杂度为 O(1). 假设有数量100,000的产品列表: import time ...
- ubuntu14.04安装搜狗拼音以及Google-chrome
安装搜狗拼音 1.进入https://pinyin.sogou.com/linux/选择合适版本下载: 2.直接打开deb包进行安装: 3.安装完成后,打开系统设置中语言支持选项,在键盘输入方式系统中 ...
- 【转】VS2017的VSIX插件开发
最近从头开发了一遍一个VSIX的插件,用于调测的一个工具: 特此把相关的过程经验记录下来: 第一步:建立工程 1. 首先是安装上: 需要安装Visual Studio SDK,这个在安装VS ...
- idea导入jdk源码查看(xjl456852原创)
idea添加了jdk环境后,却无法查看jdk源码,只能通过idea自带的反编译查看,看起来有些不爽. 下面来说一下如何设置,导入jdk源码,查看时通过源码查看jdk. 1.点击菜单 File -> ...
- centos 部署 自定义(succes)
安装前先检查一下有没有安装好了的JDK,Tomcat,MySQL,不过一般都没有. 1.安装JDK 1.1 下载jdk,可以到官网查看不同版本的下载地址 wget --no-check-certifi ...
- Knockout v3.4.0 中文版教程-15-控制文本内容和外观-attr绑定
6. attr绑定 目的 attr绑定可以给关联DOM元素的任何属性赋值.这个绑定很棒,比如,当你想要设置通过视图模型给元素的title属性.img标签的src属性或超链接的href值,当视图模型对应 ...