「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. 达梦数据库产品支持技术学习分享_Week2

    本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.文本命令行工具使用的方法(Disql和dmfldr) 二.数据库备份 三.定时作业功能 四.系统表和动 ...

  2. Go语言web开发---Beego路由

    参考链接(查看更多):https://beego.me/docs/mvc/controller/router.md 基础路由 从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由, ...

  3. NVIDIA 认证系统

    NVIDIA 认证系统 AI 是这个时代最强大的技术,需要新一代经过调整和测试的计算机来推动其发展. 自 1 月 27 日开始,可从 NVIDIA 合作伙伴处获取用于数据中心的新型加速服务器,推动 A ...

  4. 从PyTorch到ONNX的端到端AlexNet

    从PyTorch到ONNX的端到端AlexNet 这是一个简单的脚本,可将Torchvision中定义的经过预训练的AlexNet导出到ONNX中.运行一轮推理Inference,然后将生成的跟踪模型 ...

  5. ES5中的类

    之前小编对于类和类的基本特征(所谓的封装.继承.多态)理解一直不是很到位,同时在实际项目应用中也用的比较少,今天小编就结合ES5中的基本用法和大家聊聊,希望小伙伴会在这篇文章有属于自己的收获,并能够在 ...

  6. Linkerd 2.10(Step by Step)—多集群通信

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...

  7. 2021Qt打包发布教程

    因为最近写了一个程序,然后想着能给室友玩耍,就研究了一下如何打包,写这篇博客记录一下 1. 首先获得程序的Release版本 就是点击这个Release,然后构建一遍 2. 进入构建的release文 ...

  8. LCD1602液晶显示模块的单片机驱动深入详解之硬件篇

    (本文以HD44780主控芯片的LCD1602为蓝本进行描述,其中的截图也来自HD44780数据手册,用户可自行搜索其datasheet,有部分整理网上的,但绝对要比你看到的要深入得多) 一.接口 L ...

  9. Springboot集成Spring Security实现JWT认证

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 Spring Security作为成熟且强大的安全框架,得到许多大厂的青睐.而作为前后端分离的SSO方案,JWT ...

  10. 关于equals()和hashcode()的一些约定

    本文章主要讨论和回答一下几个问题: equals()的四大特性 equals()和hashcode()之间的关系,为什么我们经常说这两个方法要么都重写,要么都不重写? HashMap.HashSet等 ...