[ARC161F] Everywhere is Sparser than Whole (Judge)
Problem Statement
We define the density of a non-empty simple undirected graph as $\displaystyle\frac{(\text{number of edges})}{(\text{number of vertices})}$.
You are given positive integers $N$, $D$, and a simple undirected graph $G$ with $N$ vertices and $DN$ edges.
The vertices of $G$ are numbered from $1$ to $N$, and the $i$-th edge connects vertex $A_i$ and vertex $B_i$.
Determine whether $G$ satisfies the following condition.
Condition: Let $V$ be the vertex set of $G$.
For any non-empty proper subset $X$ of $V$, the density of the induced subgraph of $G$ by $X$ is strictly less than $D$.
There are $T$ test cases to solve.
What is an induced subgraph?
For a vertex subset $X$ of graph $G$, the induced subgraph of $G$ by $X$ is the graph with vertex set $X$ and edge set containing all edges of $G$ that connect two vertices in $X$.
In the above condition, note that we only consider vertex subsets that are neither empty nor the entire set.
Constraints
- $T \geq 1$
- $N \geq 1$
- $D \geq 1$
- The sum of $DN$ over the test cases in each input file is at most $5 \times 10^4$.
- $1 \leq A_i < B_i \leq N \ \ (1 \leq i \leq DN)$
- $(A_i, B_i) \neq (A_j, B_j) \ \ (1 \leq i < j \leq DN)$
Input
The input is given from Standard Input in the following format:
$T$
$\mathrm{case}_1$
$\mathrm{case}_2$
$\vdots$
$\mathrm{case}_T$
Each test case $\mathrm{case}_i \ (1 \leq i \leq T)$ is in the following format:
$N$ $D$
$A_1$ $B_1$
$A_2$ $B_2$
$\vdots$
$A_{DN}$ $B_{DN}$
Output
Print $T$ lines.
The $i$-th line should contain Yes
if the given graph $G$ for the $i$-th test case satisfies the condition, and No
otherwise.
Sample Input 1
2
3 1
1 2
1 3
2 3
4 1
1 2
1 3
2 3
3 4
Sample Output 1
Yes
No
- The first test case is the same as Sample Input 1 in Problem D, and it satisfies the condition.
- For the second test case, the edge set of the induced subgraph by the non-empty proper subset $\{1, 2, 3\}$ of the vertex set $\{1, 2, 3, 4\}$ is $\{(1, 2), (1, 3), (2, 3)\}$, and its density is $\displaystyle\frac{3}{3} = 1 = D$.
Therefore, this graph does not satisfy the condition.
新套路
要判定每个子图是否都满足这个要求,挺难弄的,但是移一下项。\(\frac mn<D,m<nD\),想到了 Hall定理
Hall定理内容:一个二分图存在满流,当且仅当对于任意一个左端点集 S,设 T 为所有和 S 有连边的店,那么 \(|T|\ge |S|\)
那么可以尝试构图,使得判断 \(m\) 是否小于等于 \(D\) 改为判断这个二分图是否存在满流。
把一个点拆成 \(D\) 个点,然后把每条边当成一个点,一条边 \((u,v)\) 向 \(u\) 点拆出来的和 \(v\) 点拆出来的所有点连边。这样,这个二分图满流就代表所有的 \(m\le nD\)。直接跑网络流,可以不用真拆点,把一个点向汇点的流量调为 \(D\) 就行了。
但是我们还需要判断 \(m\) 是否等于 \(nD\),Editorial里写的结论是,给原图每条边定向。如果二分图中边 \(i\) 向点 \(u\) 流出,则从 \(u\) 连到点 \(v\),否则从 \(v\) 连向点 \(u\)。易得一个点出度为 \(D\)。如果得到的图是强连通的,那么条件成立。
如果有两个强连通分量,那么关注没有出度的那一个,由于他没有出度,所有所有的边都在强连通分块内,又因为每个点都有 \(D\) 条出边,所以他的密度等于 \(D\)。
然后看是强连通分量的是不是一定满足要求,发现如果存在一个点集密度等于 \(D\),那么他没有出度,只能是整个强连通分量。
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,T=(N<<1)-1;
int t,n,d,mxf,to[N],tme,idx,dfn[N],low[N],q[N<<1],v[N<<1],hd[N<<1],id[N],tp,st[N];
template<int N,int M>struct graph{
int hd[N],e_num;
struct edge{
int u,v,nxt,f;
}e[M<<1];
void add_edge(int u,int v,int f)
{
e[++e_num]=(edge){u,v,hd[u],f};
hd[u]=e_num;
e[++e_num]=(edge){v,u,hd[v],0};
hd[v]=e_num;
}
void clear()
{
for(int i=2;i<=e_num;i++)
hd[e[i].u]=0;
e_num=1;
}
};
graph<N,N>g;
graph<N<<1,N<<2>fl;
int bfs()
{
int l,r;
for(int i=0;i<=n+n*d;i++)
fl.hd[i]=hd[i],v[i]=0;
fl.hd[T]=hd[T],v[T]=0;
v[q[l=r=1]=0]=1;
while(l<=r)
{
for(int i=fl.hd[q[l]];i;i=fl.e[i].nxt)
if(fl.e[i].f&&!v[fl.e[i].v])
v[q[++r]=fl.e[i].v]=v[q[l]]+1;
++l;
}
return v[T];
}
int dfs(int x,int f)
{
if(x==T)
return f;
for(int&i=fl.hd[x];i;i=fl.e[i].nxt)
{
int k;
if(fl.e[i].f&&v[fl.e[i].v]==v[x]+1&&(k=dfs(fl.e[i].v,min(f,fl.e[i].f))))
{
fl.e[i].f-=k;
fl.e[i^1].f+=k;
return k;
}
}
return 0;
}
void tarjan(int x)
{
dfn[x]=low[x]=++idx,st[++tp]=x;
for(int i=g.hd[x];i;i=g.e[i].nxt)
{
if(g.e[i].f&&!dfn[g.e[i].v])
{
tarjan(g.e[i].v);
low[x]=min(low[x],low[g.e[i].v]);
}
else if(g.e[i].f&&!id[g.e[i].f])
low[x]=min(low[x],dfn[g.e[i].v]);
}
if(low[x]==dfn[x])
{
++tme;
while(st[tp]^x)
id[st[tp--]]=tme;
id[st[tp--]]=tme;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
g.clear(),fl.clear();
for(int i=0;i<=n*d;i++)
dfn[i]=id[i]=0;
idx=tme=mxf=tp=0;
scanf("%d%d",&n,&d);
for(int i=1,u,v;i<=n*d;i++)
{
scanf("%d%d",&u,&v);
g.add_edge(u,v,0);
fl.add_edge(0,i,1);
fl.add_edge(i,n*d+u,1);
to[i]=fl.e_num;
fl.add_edge(i,n*d+v,1);
}
for(int i=1;i<=n;i++)
fl.add_edge(i+n*d,T,d);
for(int i=0;i<=n*d+n;i++)
hd[i]=fl.hd[i];
hd[T]=fl.hd[T];
int k;
while(bfs())
while(k=dfs(0,2000000000))
mxf+=k;
if(mxf!=n*d)
{
puts("No");
continue;
}
for(int i=1;i<=n*d;i++)
{
if(fl.e[to[i]].f)
g.e[i<<1].f=1;
else
g.e[i<<1|1].f=1;
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
puts(tme^1? "No":"Yes");
}
}
[ARC161F] Everywhere is Sparser than Whole (Judge)的更多相关文章
- Gym 101102C---Bored Judge(区间最大值)
题目链接 http://codeforces.com/gym/101102/problem/C problem description Judge Bahosain was bored at ACM ...
- NOJ 1074 Hey Judge(DFS回溯)
Problem 1074: Hey Judge Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: ...
- 【教程】如何正确的写一个Lemon/Cena的SPJ(special judge)
转自:http://www.cnblogs.com/chouti/p/5752819.html Special Judge:当正确的输出结果不唯一的时候需要的自定义校验器 首先有个框架 #includ ...
- 九度 Online Judge 之《剑指 Offer》一书相关题目解答
前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...
- UVa Online Judge 工具網站
UVa Online Judge 工具網站 UVa中译题uHuntAlgorithmist Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 Mirror UVa Online Judg ...
- [swustoj 1021] Submissions of online judge
Submissions of online judge(1021) 问题描述 An online judge is a system to test programs in programming c ...
- HDOJ/HDU 1073 Online Judge(字符串处理~)
Problem Description Ignatius is building an Online Judge, now he has worked out all the problems exc ...
- write a macro to judge big endian or little endian
Big endian means the most significant byte stores first in memory. int a=0x01020304, if the cpu is b ...
- UVA 489-- Hangman Judge(暴力串处理)
Hangman Judge In ``Hangman Judge,'' you are to write a program that judges a series of Hangman gam ...
- 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告
杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozh ...
随机推荐
- 02.中台框架前台项目 admin.ui.plus 学习-介绍与简单使用
中台框架前台项目 admin.ui.plus 的初识 基于 vue3.x + CompositionAPI setup 语法糖 + typescript + vite + element plus + ...
- 深入理解MySQL:数据类型、查询优化、索引、事务处理和数据备份与恢复
摘要: MySQL 是一种常用的关系型数据库管理系统,对于开发者和数据库管理员来说,掌握 MySQL 的关键概念和最佳实践非常重要.本文将围绕 MySQL 的数据类型.查询优化.索引.事务处理以及数据 ...
- Flutter系列文章-Flutter在实际业务中的应用
不同场景下的解决方案 1. 跨平台开发: 在移动应用开发中,面对不同的平台(iOS和Android),我们通常需要编写两套不同的代码.而Flutter通过一套代码可以构建适用于多个平台的应用,大大提高 ...
- LeetCode46全排列(回溯入门)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 题目描述 难度:中等 给定一个不含重复数字的数组 nu ...
- Codeforces 1462E2 Close Tuples (hard version)
题意 给一个长度为\(n\)的数组,取\(m\)个数字,其中最大值最小值相差不大于\(k\),问这种方式有多少种,答案\(\mod 10^9+7\). 分析 通过简单版本大概了解了这题要枚举最小值来判 ...
- SpringBoot + 自定义注解,实现用户操作日志(支持SpEL表达式)
背景 一个成熟的系统,都会针对一些关键的操作,去创建用户操作日志. 比如: XX人创建了一条订单,订单号:XXXXXXXXX 因为操作人或者订单号是动态的,所以有些开发人员,不知道获取,就将这种操作日 ...
- 「acmhdu - 6314」Matrix
link. 首先将问题弱化为 1-d,我们待定容斥系数 \(f_i\),可以写出答案的式子:\(\sum\limits_{i=a}^nf_i\binom{n}{i}2^{n-i}\).解释就是,我们想 ...
- Python正则表达式——常用re正则表达式集合
文章目录 一.校验数字的表达式 二.校验字符的表达式 三.特殊需求表达式 一.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^ ...
- Django CMS搭建--1.虚拟环境搭建
客户端环境:windows10 1.virtualenv使用 virtualenv 是 Python 中的一个包,用于创建和管理虚拟环境,可以在不同的项目中使用不同的 Python 版本和第三方库,避 ...
- 【Postman】以命令行形式执行Postman脚本(使用newman)
以命令行形式执行Postman脚本(使用Newman) 目录 以命令行形式执行Postman脚本(使用Newman) 一.背景 二.Newman的安装 1.Node.js 2.Newman 三.脚本准 ...