#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
using ll = long long;
const ll MAXN = 200005;
struct pair_hash {
size_t operator()(const pair<ll, ll>& p) const {
return ((p.fi << 32) | p.se);
}
};
unordered_set<pair<ll, ll>, pair_hash> bridges;
unordered_multiset<pair<ll, ll>, pair_hash> edges_num;
vector<ll> edges[MAXN];
ll tin[MAXN], low[MAXN];
bool vis[MAXN];
ll timer = 0;
void dfsbd(ll v, ll p) {
if (vis[v]) return;
vis[v] = 1;
tin[v] = low[v] = timer++;
for (ll u : edges[v]) {
if (u == p) continue;
if (!vis[u]) {
dfsbd(u, v);
low[v] = min(low[v], low[u]);
if (low[u] > tin[v] && edges_num.count({v, u}) == 1) bridges.insert({v, u});
} else {
low[v] = min(low[v], tin[u]);
}
}
}
ll who[MAXN];
void dfs_coloring(ll v, ll c) {
if (vis[v]) return;
vis[v] = 1;
who[v] = c;
for (ll u : edges[v]) {
if (bridges.count({v, u}) || bridges.count({u, v})) continue;
dfs_coloring(u, c);
}
}
unordered_set<ll> wedges[MAXN];
bool dfs(ll v, ll p, ll dest) {
if (vis[v]) return false;
vis[v] = 1;
if (v == dest) return true;
for (ll u : wedges[v]) {
if (u == p) continue;
if (dfs(u, v, dest)) {
// v----->u
wedges[u].erase(v);
return true;
}
}
return false;
}
void solve() {
ll n, m;
cin >> n >> m;
unordered_map<pair<ll, ll>, ll, pair_hash> edge2ind;
for (ll i = 0; i < m; i++) {
ll v, u;
cin >> v >> u;
v--, u--;
edges[v].push_back(u);
edges[u].push_back(v);
edges_num.insert({v, u});
edges_num.insert({u, v});
edge2ind[{v, u}] = i;
edge2ind[{u, v}] = i;
}
for (ll v = 0; v < n; v++) tin[v] = low[v] = 1e18;
for (ll v = 0; v < n; v++) {
if (vis[v]) continue;
dfsbd(v, -1);
}
memset(vis, 0, sizeof(vis));
ll comp_num = 0;
for (ll v = 0; v < n; v++) {
if (vis[v]) continue;
dfs_coloring(v, comp_num);
comp_num++;
}
unordered_map<pair<ll, ll>, tuple<ll, ll, char>, pair_hash> w2e;
for (ll v = 0; v < n; v++) {
for (ll u : edges[v]) {
if (who[v] == who[u]) continue;
wedges[who[v]].insert(who[u]);
w2e[{who[v], who[u]}] = {v, u, 'R'};
w2e[{who[u], who[v]}] = {u, v, 'L'};
}
}
memset(vis, 0, sizeof(vis));
ll p; cin >> p;
while (p--) {
ll v, u;
cin >> v >> u;
v--, u--;
if (who[v] == who[u]) continue;
dfs(who[v], -1, who[u]);
}
string ans(m, 'B');
for (ll v = 0; v < comp_num; v++) {
for (ll u : wedges[v]) {
auto[a, b, dir] = w2e[{v, u}];
if (dir == 'L') swap(a, b);
ans[edge2ind[{a, b}]] = dir;
}
}
cout << ans << '\n';
}
int main() {
// freopen("promote.in", "r", stdin);
// freopen("promote.out", "w", stdout);
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
solve();
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |