#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 = 100005;
const ll MAXM = 100005;
vector<tuple<ll, ll, char>> edges[MAXN];
bool vis[MAXN];
ll tin[MAXN], low[MAXN];
bool is_bridge[MAXM];
ll timer = 0;
ll who[MAXN];
ll comp_num = 1;
stack<ll> st;
void find_bridges(ll v, ll peid) {
if (vis[v]) return;
vis[v] = 1;
tin[v] = low[v] = timer++;
st.push(v);
for (auto[u, id, dir] : edges[v]) {
if (id == peid) continue;
if (!vis[u]) {
find_bridges(u, id);
low[v] = min(low[v], low[u]);
if (low[u] > tin[v]) {
is_bridge[id] = 1;
while (1) {
ll x = st.top();
st.pop();
who[x] = comp_num;
if (x == u) break;
}
comp_num++;
}
} else {
low[v] = min(low[v], tin[u]);
}
}
}
vector<tuple<ll, ll, char>> tecc_edges[MAXN];
string ans;
bool dfs(ll v, ll p, ll dest) {
if (v == dest) return true;
for (auto[u, id, dir] : tecc_edges[v]) {
if (u == p) continue;
if (dfs(u, v, dest)) {
ans[id] = dir;
return true;
}
}
return false;
}
void solve() {
ll n, m;
cin >> n >> m;
for (ll i = 0; i < m; i++) {
ll v, u;
cin >> v >> u;
v--, u--;
edges[v].push_back({u, i, 'R'});
edges[u].push_back({v, i, 'L'});
}
for (ll v = 0; v < n; v++) tin[v] = low[v] = 1e18;
for (ll v = 0; v < n; v++) {
if (vis[v]) continue;
find_bridges(v, -1);
}
for (ll v = 0; v < n; v++) {
for (auto[u, id, dir] : edges[v]) {
if (who[v] == who[u]) continue;
tecc_edges[who[v]].push_back({who[u], id, dir});
}
}
ans.assign(m, 'B');
ll q; cin >> q;
while (q--) {
ll v, u;
cin >> v >> u;
v--, u--;
dfs(who[v], -1, who[u]);
}
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... |