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 ...
随机推荐
- PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)
PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20) http://www.patest.cn/contests/pat-b-practise/1027 本题 ...
- PAT (Basic Level) Practise (中文)-1028. 人口普查(20)
PAT (Basic Level) Practise (中文)-1028. 人口普查(20) http://www.patest.cn/contests/pat-b-practise/1028 某 ...
- shelll脚本,根据软链接,找到真实路径
[root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...
- java在线聊天项目0.4版本 制作服务端接收连接,客户端连接功能 新增客户端窗口打开时光标指向下边文本域功能,使用WindowListener监听WindowAdapter
建一个服务端类ChatServer,用于设置端口接收连接 package com.swift; import java.io.IOException; import java.net.ServerSo ...
- 简单jQuery图片自适应宽度插件jQuery.imgAutoSize.js
(function ($) { var loadImg = function (url, fn) { var img = new Image(); img. ...
- 【Java_多线程并发编程】JUC原子类——4种原子类
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: Atom ...
- python--操作系统介绍,进程的创建(并发)
一 . 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 所谓多道程序设计技术,就是指允许多个程序同时进入内存 ...
- Python9-面对对象1-day22
def Person(name,blood,aggr,sex): person = { 'name' : name, 'blood':blood, 'aggr': aggr, 'sex' : sex, ...
- 经典DP问题--poj1088滑雪
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- PAT Basic 1045
1045 快速排序 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同 ...