「CF555E」 Case of Computer Network

传送门

又是给边定向的题目(马上想到欧拉回路)

然而这个题没有对度数的限制,你想歪了。

然后又开始想一个类似于匈牙利的算法:我先跑,如果遇到要占用这条边的,我就把原来的去掉这条边试试能不能走其他路,然后这样做一遍。

这可能能够解决 \(n\) 比较小的时候的问题?

然而这题 \(n,m\le 2\times 10^5\)。

然后又想先整出他的 \(\texttt{DFS}\) 树,然后再暴力改发现完全方向错了。

事实上一个边双连通分量里存在一种定向方式使得任意两点可达。

于是我们可以缩点,然后就变成了一棵树。

一棵树就好做了,我们只需要差分覆盖,最后检查每一条边是否只有一种方向的覆盖标记即可。

贴代码

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
struct edge{
int to,nex;
}e[maxn<<1];
int head[maxn],cnt=1;
void add(int a,int b){
e[++cnt]=(edge){b,head[a]};
head[a]=cnt;
}
int dfn[maxn],low[maxn],tim;
int cut[maxn<<1];
int col[maxn],num;
void tarjan(int u,int f){
dfn[u]=low[u]=++tim;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) cut[i]=cut[i^1]=1;
}
else if(v!=f) low[u]=min(low[u],dfn[v]);
}
}
void dfs2(int u){
col[u]=num;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(col[v]||cut[i]) continue;
dfs2(v);
}
}
vector<int> t[maxn];
int dep[maxn],siz[maxn],son[maxn],top[maxn],fa[maxn],tag[maxn],id;
void dfs3(int u,int f){
fa[u]=f;dep[u]=dep[f]+1;
siz[u]=1;tag[u]=id;
for(auto v:t[u]){
if(v==f) continue;
dfs3(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v]) son[u]=v;
}
}
void dfs4(int u,int f){
top[u]=f;
if(son[u]) dfs4(son[u],f);
for(auto v:t[u]){
if(v==fa[u]||v==son[u]) continue;
dfs4(v,v);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>=dep[top[y]]) x=fa[top[x]];
else y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
int up[maxn],down[maxn];
bool dfs5(int u,int f){
for(auto v:t[u]){
if(v==f) continue;
if(!dfs5(v,u)||(up[v]&&down[v])) return 0;
up[u]+=up[v],down[u]+=down[v];
}
return 1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m,q;cin>>n>>m>>q;
for(int i=1;i<=m;++i){
int a,b;cin>>a>>b;
add(a,b),add(b,a);
}
for(int i=1;i<=n;++i)
if(!dfn[i]) tarjan(i,0);
for(int i=1;i<=n;++i)
if(!col[i]) ++num,dfs2(i);
for(int u=1;u<=n;++u)
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(col[u]<col[v]){
t[col[u]].emplace_back(col[v]);
t[col[v]].emplace_back(col[u]);
}
}
for(int i=1;i<=num;++i)
if(!tag[i]) ++id,dfs3(i,0),dfs4(i,i);
for(int i=1;i<=q;++i){
int a,b;cin>>a>>b;
a=col[a],b=col[b];
if(tag[a]!=tag[b]){
cout<<"No\n";
return 0;
}
int c=lca(a,b);
++up[a],--up[c];
++down[b],--down[c];
}
for(int i=1;i<=num;++i)
if(fa[i]==0&&(!dfs5(i,0))){
cout<<"No\n";
return 0;
}
cout<<"Yes\n";
return 0;
}

「CF555E」 Case of Computer Network的更多相关文章

  1. Solution -「CF 555E」Case of Computer Network

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的无向图,判断是否有给每条边定向的方案,使得 \(q\) 组有序点对 \((s,t)\) ...

  2. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  3. (中等) CF 555E Case of Computer Network,双连通+树。

    Andrewid the Android is a galaxy-known detective. Now he is preparing a defense against a possible a ...

  4. CF555E Case of Computer Network

    题面:https://www.luogu.com.cn/problem/CF555E 题意:给定一张\(n\)个点\(m\)条边的无向图. 给定\(q\)组有向点对\((s,t)\). 询问是否存在使 ...

  5. 题解 CF555E Case of Computer Network

    题目传送门 题目大意 给出一个\(n\)个点\(m\)条边的无向图,有\(q\)次有向点对\((s,t)\),问是否存在一种方法定向每条边使得每个点对可以\(s\to t\). \(n,m,q\le ...

  6. 555E Case of Computer Network

    分析 一个连通块内的肯定不影响 于是我们先缩点 之后对于每个路径 向上向下分别开一个差分数组 如果两个数组同时有值则不合法 代码 #include<bits/stdc++.h> using ...

  7. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  8. 「CF1023F」Mobile Phone Network

    「CF1023F」Mobile Phone Network 传送门 直接钦定那 \(k\) 条边在最小生成树中,然后把最小生成树树剖一下. 每条其它边的效果就是把该边端点路径上的边的权对该边边权取 \ ...

  9. 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!

    ❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...

随机推荐

  1. 「 洛谷 」P2151 [SDOI2009]HH去散步

    小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...

  2. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

  3. Step By Step(Lua表达式和语句)

    Step By Step(Lua表达式和语句) 一.表达式:    1. 算术操作符:    Lua支持常规算术操作符有:二元的"+"."-"."*& ...

  4. GO学习-(5) Go语言基础之基本数据类型

    Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 基本数据类型 整型 整型 ...

  5. DelayQueue延迟队列原理剖析

    DelayQueue延迟队列原理剖析 介绍 DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现Delayed接口的元素,实现接口后相当于是每个元素都有个过期时间,当队列进 ...

  6. 向Relay添加算子

    向Relay添加算子 为了在Relay IR中使用TVM算子,需要在Relay中注册算子,以确保将其集成到Relay的类型系统中. 注册算子需要三个步骤: 使用RELAY_REGISTER_OPC + ...

  7. RISC-V与DSA计算机架构

    RISC-V与DSA计算机架构 相信所有和计算机体系结构打过交道的朋友们都看过David Patterson与John Hennessy的煌煌巨作,<计算机体系架构:量化研究方法>.两位在 ...

  8. 多篇开源CVPR 2020 语义分割论文

    多篇开源CVPR 2020 语义分割论文 前言 1. DynamicRouting:针对语义分割的动态路径选择网络 Learning Dynamic Routing for Semantic Segm ...

  9. 简化可视SLAM应用程序的开发

    简化可视SLAM应用程序的开发 Easing the development of visual SLAM applications 同步定位和映射(SLAM)描述了一个设备(如机器人)使用传感器数据 ...

  10. 解决redis集群版本不一致导致RDB同步失败的问题

    某天,运维反馈某两个机房的出口流量和入口流量过大,并且持续了好一段时间. 再仔细排查后发现是 redis 集群的几台服流量问题,于是开始查日志. 在日志中发现出现大量的 Can't handle RD ...