题目描述

给定一张 \(n\) 个点 \(m\) 条边的无向图,现在想要把这张图定向。

有 \(p\) 个限制条件,每个条件形如 \((xi,yi)\) ,表示在新的有向图当中,\(x_i\) 要能够沿着一些边走到 \(y_i\) ​​。

现在请你求出,每条边的方向是否能够唯一确定。同时请给出这些能够唯一确定的边的方向。

输入格式

第一行两个空格隔开的正整数 \(n,m\) 。

接下来 \(m\) 行,每行两个空格隔开的正整数 \(a_i,b_i\) ,表示 \(a_i,b_i\) 之间有一条边。

接下来一行一个整数 \(p\),表示限制条件的个数。

接下来 \(p\) 行,每行两个空格隔开的正整数 \(x_i,y_i\),描述一个 \((x_i,y_i)\) 的限制条件。

输出格式

输出一行一个长度为 \(m\) 的字符串,表示每条边的答案:

  • 若第 \(i\) 条边必须得要是 \(a_i\)​​ 指向 \(b_i\) 的,那么这个字符串的第 \(i\) 个字符应当为 R

  • 若第 \(i\) 条边必须得要是 \(b_i\) 指向 \(a_i\) 的,那么这个字符串的第 \(i\) 个字符应当为 L

  • 否则,若第 \(i\) 条边的方向无法唯一确定,那么这个字符串的第 \(i\) 个字符应当为 B

样例

样例输入

5 6
1 2
1 2
4 3
2 3
1 3
5 1
2
4 5
1 3

样例输出

BBRBBL

数据范围与提示

对于所有测试点,有 \(1\le n,m,p\le 100\ 000;1\le a_i,b_i,x_i,y_i\le n\) 。

  • 子任务 1(\(30\%\)):有 \(n,m\le 1000;p\le 100\) ;

  • 子任务 2(\(30\%\)):有 \(p\le 100\) ;

  • 子任务 3(\(40\%\)):无特殊限制。

题解

在同一个点双内的显然不能完全确定

所以先Tarjan找点双并缩点

对于剩下的点与询问,就是在一棵树上了,随便搞一搞就好了

我是用的一种奇怪的方法

对于一个点,它的权值记录了它和它的父亲之间的边的方向

对于一个询问,找到询问中两个点的LCA,然后在两个点都打上LCA的标记,代表它们到LCA的这段路径上的所有边的方向全部为某个方向

由于题目保证无冲突,所以是不会有一条边会被赋值两次的

所有标记打完后,一遍dfs处理完所有标记就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10,inf=0x3f3f3f3f;
int n,m,q,e=1,beg[MAXN],nex[MAXN<<1],to[MAXN<<1],DFN[MAXN],LOW[MAXN],Visit_Num,bridge[MAXN<<1],cnt,bel[MAXN],qto[MAXN<<1],qnex[MAXN<<1],qbeg[MAXN],Jie[MAXN][21],up[MAXN],dep[MAXN],qe,mk[MAXN],ps[MAXN],nt;
struct node{
int u,v;
};
node side[MAXN];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
}
inline void qinsert(int x,int y)
{
qto[++qe]=y;
qnex[qe]=qbeg[x];
qbeg[x]=qe;
}
inline void Tarjan(int x,int f)
{
DFN[x]=LOW[x]=++Visit_Num;ps[x]=nt;
for(register int i=beg[x];i;i=nex[i])
if(!DFN[to[i]])
{
Tarjan(to[i],x);
chkmin(LOW[x],LOW[to[i]]);
if(LOW[to[i]]>DFN[x])bridge[i]=bridge[i^1]=1;
}
else if(DFN[to[i]]<DFN[x]&&to[i]!=f)chkmin(LOW[x],DFN[to[i]]);
}
inline void dfs(int x)
{
DFN[x]=1;bel[x]=cnt;
for(register int i=beg[x];i;i=nex[i])
if(bridge[i])continue;
else if(!DFN[to[i]])dfs(to[i]);
}
inline void idfs(int x,int f)
{
Jie[x][0]=f;dep[x]=dep[f]+1;
for(register int i=qbeg[x];i;i=qnex[i])
if(qto[i]==f)continue;
else idfs(qto[i],x);
}
inline void init()
{
for(register int j=1;j<=19;++j)
for(register int i=1;i<=cnt;++i)Jie[i][j]=Jie[Jie[i][j-1]][j-1];
}
inline int LCA(int u,int v)
{
if(dep[u]<dep[v])std::swap(u,v);
if(dep[u]>dep[v])
for(register int i=19;i>=0;--i)
if(dep[Jie[u][i]]>=dep[v])u=Jie[u][i];
if(u==v)return u;
for(register int i=19;i>=0;--i)
if(Jie[u][i]!=Jie[v][i])u=Jie[u][i],v=Jie[v][i];
return Jie[u][0];
}
inline void edfs(int x,int f)
{
for(register int i=qbeg[x];i;i=qnex[i])
if(qto[i]!=f)edfs(qto[i],x),chkmin(up[x],up[qto[i]]);
if(up[x]<dep[f])mk[f]=mk[x];
}
int main()
{
read(n);read(m);
for(register int i=1;i<=m;++i)
{
int u,v;read(u);read(v);
insert(u,v);insert(v,u);
side[i]=(node){u,v};
}
for(register int i=1;i<=n;++i)
if(!DFN[i])++nt,Tarjan(i,0);
memset(DFN,0,sizeof(DFN));
for(register int i=1;i<=n;++i)
if(!DFN[i])++cnt,dfs(i);
for(register int i=1,u,v;i<=m;++i)
if((u=bel[side[i].u])!=(v=bel[side[i].v]))qinsert(u,v),qinsert(v,u);
for(register int i=1;i<=cnt;++i)
if(!dep[i])idfs(i,0);
init();
memset(up,inf,sizeof(up));
read(q);
while(q--)
{
int x,y,lca;read(x);read(y);
if(bel[x]==bel[y]||ps[x]!=ps[y])continue;
x=bel[x],y=bel[y];lca=LCA(x,y);
if(x!=lca)chkmin(up[x],dep[lca]),mk[x]=-1;
if(y!=lca)chkmin(up[y],dep[lca]),mk[y]=1;
}
edfs(1,0);
for(register int i=1,u,v;i<=m;++i)
{
u=side[i].u,v=side[i].v;
if(bel[u]==bel[v])putchar('B');
else
{
u=bel[u],v=bel[v];
if(dep[u]>dep[v])
{
if(mk[u]==-1)putchar('R');
else if(mk[u]==1)putchar('L');
else putchar('B');
}
else
{
if(mk[v]==-1)putchar('L');
else if(mk[v]==1)putchar('R');
else putchar('B');
}
}
}
puts("");
return 0;
}

【刷题】LOJ 2480 「CEOI2017」One-Way Streets的更多相关文章

  1. @loj - 2480@ 「CEOI2017」One-Way Streets

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一张 n 个点 m 条边的无向图,现在想要把这张图定向. 有 ...

  2. loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治

    loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(su ...

  3. loj#2483. 「CEOI2017」Building Bridges(dp cdq 凸包)

    题意 题目链接 Sol \[f[i], f[j] + (h[i] - h[j])^2 + (w[i - 1] - w[j]))\] 然后直接套路斜率优化,发现\(k, x\)都不单调 写个cdq就过了 ...

  4. 【动态规划】loj#2485. 「CEOI2017」Chase

    有意思的可做dp题:细节有点多,值得多想想 题目描述 在逃亡者的面前有一个迷宫,这个迷宫由 nnn 个房间和 n−1n-1n−1 条双向走廊构成,每条走廊会链接不同的两个房间,所有的房间都可以通过走廊 ...

  5. @loj - 2483@「CEOI2017」Building Bridges

    目录 @desription@ @solution@ @accepted code@ @details@ @another solution@ @another code@ @desription@ ...

  6. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

  7. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  8. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  9. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

随机推荐

  1. charles抓包https/模拟弱网/设置断点重定向/压测

    charles几个常用功能   1,ios 抓包https网页:(如未配置,会显示unknown) 第一步是:给手机安装SSL证书 手机和电脑在同一wifi下,手机wifi配置http代理,ip是电脑 ...

  2. python包管理工具pip

    你可以使用一个名为 pip 的程序来安装.升级和移除软件包.默认情况下 pip 将从 Python Package Index <https://pypi.org> 安装软件包.你可以在浏 ...

  3. linux常用命令总结(含选项参数)

    • 用户切换 su              切换到root用户并不切换环境 su - root   切换到root用户并切换环境 su  redhat  切换到redhat不切换环境 • cd切换目 ...

  4. python函数式编程,性能,测试,编码规范

    这篇文章主要是对我收集的一些文章的摘要.因为已经有很多比我有才华的人写出了大量关于如何成为优秀Python程序员的好文章. 我的总结主要集中在四个基本题目上:函数式编程,性能,测试,编码规范.如果一个 ...

  5. [面试]CVTE 2019提前批 Windows应用开发一面

    7.30接到面试电话问有没有时间进行一个20分钟左右的电话面试,不巧当时要去赶火车,就约到了两天后. 8.1还是同一个面试官打来电话 首先介绍项目吧,第一场面试,项目准备的也不怎么充分,讲了一个HAL ...

  6. centos7.6 安装 openvpn--2.4.7

    openvpn-server端 搭建 1,软件版本 Centos - 7.x easy-rsa - 3.0.3 OpenVPN - 2.4.7 2,安装 建议安装启用epel源,采用yum的方式安装o ...

  7. JavaScript学习(1)之JavaScript基础

    JavaScript学习(1)之JavaScript基础 由于工作原因,开发语言逐渐以JavaScript为主,所以,抽空学习了下JavaScript语法.等现阶段的工作稳定之后,陆续会分享下自己在学 ...

  8. access和MySQL mssql

    Access.MSSQL.MYSQL数据库之间有什么区别?     Access数据库.MSSQL数据库.MYSQL数据库之间有什么区别?        不少企业和个人站长在网站制作时,会对数据库的概 ...

  9. SpringBoot集成dubbo实例

    项目总览图: 最下面有项目的pom,具体内容: 项目运行注意事项: 先启动 provider, 将providers.xml中 port 先修改为20187 执行test目录 下的DubboProvi ...

  10. sprint2(第六天)

    昨天休息一天,今天继续做任务. 燃尽图: