#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
int read()
{
int res=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
res=(res<<3)+(res<<1)+ch-'0';
ch=getchar();
}
return res*f;
}
int n,m,p;
struct graph
{
struct edge
{
int u,v,nxt;
}e[N<<1];
int head[N],tot=1;
void add(int u,int v)
{
e[++tot]=edge{u,v,head[u]};
head[u]=tot;
}
}g[2];
int dfn[N],low[N],cur;
int brg[N];
void tarjan(int u)
{
dfn[u]=low[u]=++cur;
for(int i=g[0].head[u];i;i=g[0].e[i].nxt)
{
int v=g[0].e[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]) brg[i]=brg[i^1]=1;
}
else low[u]=min(low[u],dfn[v]);
}
}
int col,bel[N];
void dfs1(int u)
{
bel[u]=col;
for(int i=g[0].head[u];i;i=g[0].e[i].nxt)
{
int v=g[0].e[i].v;
if(bel[v]||brg[i]) continue;
dfs1(v);
}
}
int ans[N];
int dep[N];
void dfs2(int u,int f)
{
dep[u]=dep[f]+1;
for(int i=g[1].head[u];i;i=g[1].e[i].nxt)
{
int v=g[1].e[i].v;
if(v==f) continue;
dfs2(v,u);
ans[u]+=ans[v];
}
}
int main()
{
n=read(),m=read();
for(int i=1,u,v;i<=m;i++)
{
u=read(),v=read();
g[0].add(u,v),g[0].add(v,u);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++)
if(!bel[i]) col++,dfs1(i);
for(int u=1;u<=n;u++)
for(int i=g[0].head[u];i;i=g[0].e[i].nxt)
{
int v=g[0].e[i].v;
if(bel[u]!=bel[v]) g[1].add(bel[u],bel[v]);
}
p=read();
while(p--) ans[bel[read()]]++,ans[bel[read()]]--;
for(int i=1;i<=col;i++)
if(!dep[i]) dfs2(i,0);
for(int i=2;i<=g[0].tot;i+=2)
{
int u=g[0].e[i].u,v=g[0].e[i].v;
if(bel[u]==bel[v]) printf("B");
else
{
u=bel[u],v=bel[v];
if(dep[u]<dep[v]) printf(ans[v]>0?"L":(ans[v]<0?"R":"B"));
else printf(ans[u]>0?"R":(ans[u]<0?"L":"B"));
}
}
return 0;
}
RT,这是本人代码,在第102行中如果建的是双向边就会TLE。
个人不是很能理解建单向边的正确性。