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)的更多相关文章

  1. Gym 101102C---Bored Judge(区间最大值)

    题目链接 http://codeforces.com/gym/101102/problem/C problem description Judge Bahosain was bored at ACM ...

  2. NOJ 1074 Hey Judge(DFS回溯)

    Problem 1074: Hey Judge Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format: ...

  3. 【教程】如何正确的写一个Lemon/Cena的SPJ(special judge)

    转自:http://www.cnblogs.com/chouti/p/5752819.html Special Judge:当正确的输出结果不唯一的时候需要的自定义校验器 首先有个框架 #includ ...

  4. 九度 Online Judge 之《剑指 Offer》一书相关题目解答

    前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...

  5. UVa Online Judge 工具網站

    UVa Online Judge 工具網站   UVa中译题uHuntAlgorithmist Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 Mirror UVa Online Judg ...

  6. [swustoj 1021] Submissions of online judge

    Submissions of online judge(1021) 问题描述 An online judge is a system to test programs in programming c ...

  7. HDOJ/HDU 1073 Online Judge(字符串处理~)

    Problem Description Ignatius is building an Online Judge, now he has worked out all the problems exc ...

  8. 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 ...

  9. UVA 489-- Hangman Judge(暴力串处理)

     Hangman Judge  In ``Hangman Judge,'' you are to write a program that judges a series of Hangman gam ...

  10. 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告

    杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozh ...

随机推荐

  1. ATtiny88初体验(一):点灯

    ATtiny88初体验(一):点灯 最近逛淘宝时,发现一块ATtiny88核心板(MH-ET LIVE Tiny88)用完红包后只剩4块钱了,果断下单,准备好好把玩一番. MH-ET LIVE Tin ...

  2. 部署属于自己的New bing Ai

    该项目来源 https://github.com/adams549659584/go-proxy-bingai 项目体验地址 https://bing.vcanbb.top/web/#/ 项目介绍 基 ...

  3. 《Linux基础》02. 目录结构 · vi、vim · 关机 · 重启

    @ 目录 1:目录结构 2:vi.vim快速入门 2.1:vi 和 vim 的三种模式 2.1.1:一般模式 2.1.2:编辑模式 2.1.3:命令模式 2.2:常用快捷键 2.2.1:一般模式 2. ...

  4. CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark

    Apache Hudi的DeltaStreamer是一种以近实时方式摄取数据并写入Hudi表的工具类,它简化了流式数据入湖并存储为Hudi表的操作,自 0.10.0 版开始,Hudi又在DeltaSt ...

  5. 聊透 GPU 通信技术——GPU Direct、NVLink、RDMA 审核中

    最近人工智能大火,AI 应用所涉及的技术能力包括语音.图像.视频.NLP 等多方面,而这些都需要强大的计算资源支持.AI 技术对算力的需求是非常庞大的,虽然 GPU 的计算能力在持续提升,但是对于 A ...

  6. C# Wke例子 -- WebUI登录窗口

    概述 Wke介绍: http://blog.csdn.net/sabrecode/article/details/78145938 用Wke做了一个登录窗口, webui比较特殊. 因为它就是一个超文 ...

  7. 教育法学第九章单元测试MOOC

    第九章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 作为教师最基本的 ...

  8. P4032 [Code+#2] 火锅盛宴

    prologue 树状数组推荐写法,感谢巨佬樱雪喵的教学. inline int lowbit(int x) { return x & -x; } inline void add(int x, ...

  9. the solution of Mining Your Own Business

    the description of problem (我看的是 PDF 里面的原题所以这里描述会和题目不一样,但是大意一致) 给定一个未必连通的无向图,问最少在几个点设置出口,可以保证任意一个点坍塌 ...

  10. 当个 PM 式程序员「GitHub 热点速览」

    本周 GitHub 热点依旧是 GPT 类项目,当中的佼佼者自然是本文收录的 gpt-pilot,一周获得了 7k+ star.此外,像是 LangChain.Autogen 之类的 LLM 工具链项 ...