#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
ii edges[100005];
int p[100005];
int label[100005];
int edgeId[100005];
vector<ii> adj[100005];
bool isBridge[100005];
int low[100005];
int depth[100005];
bool pathCompressed[100005];
void tarjan(int u){
low[u] = depth[u];
for(ii e : adj[u]){
int v = e.first, id = e.second;
if(depth[v] == 0){
p[v] = u;
depth[v] = depth[u] + 1;
tarjan(v);
if(low[v] > depth[u]) isBridge[id] = true;
low[u] = min(low[u], low[v]);
edgeId[v] = id;
}
else if(v != p[u]) low[u] = min(low[u], depth[v]);
}
}
int component[100005];
int cnt = 1;
void compress(int s){
component[s] = cnt;
for(ii e : adj[s]){
int v = e.first, id = e.second;
if(component[v] == 0 && !isBridge[id]){
compress(v);
}
}
}
vector<ii> tree[100005];
int ans[100005];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
for(int i = 1;i <= m;i++){
int a, b; cin >> a >> b;
edges[i] = ii(a, b);
adj[a].push_back(ii(b,i));
adj[b].push_back(ii(a,i));
}
for(int i = 1;i <= n;i++){
if(depth[i] != 0) continue;
depth[i] = 1;
tarjan(i);
}
for(int i = 1;i <= n;i++){
if(component[i] != 0) continue;
compress(i);
cnt++;
}
/*
for(int i = 1;i <= m;i++){
if(isBridge[i]){
int a = component[edges[i].first];
int b = component[edges[i].second];
tree[a].push_back(ii(b,i));
tree[b].push_back(ii(a,i));
}
}
*/
for(int i = 1;i <= m;i++){
if(isBridge[i]){
int a = edges[i].first, b = edges[i].second;
if(component[a] == component[b]) isBridge[i] = false;
}
}
int Q; cin >> Q;
while(Q--){
int s, t; cin >> s >> t;
int labelS = 1, labelT = 2;
vector<int> nodes;
while(s != t){
//cout << s << " " << t << endl;
if(depth[s] >= depth[t]){
//cout << s << " " << labelS << endl;
if(!pathCompressed[s]) label[s] = labelS;
pathCompressed[s] = true;
s = p[s];
}
else{
//cout << t << " " << labelT << endl;
if(!pathCompressed[t]) label[t] = labelT;
pathCompressed[t] = true;
t = p[t];
}
}
int P = s;
for(int x : nodes){
p[x] = P;
}
}
for(int i = 1;i <= n;i++){
int e = edgeId[i];
if(e == 0) continue;
if(!isBridge[e]) continue;
int a = edges[e].first;
int b = edges[e].second;
bool swapped = false;
if(depth[a] > depth[b]){
swap(a, b);
swapped = true;
}
//cout << a << " " << b << " " << depth[a] << " " << depth[b] << " " << label[b] << "\n";
int ANS = label[b];
if(ANS == 0) continue;
if(swapped) ANS = 3 - ANS;
ans[e] = ANS;
}
string S = "BLR";
for(int i = 1;i <= m;i++){
if(!isBridge[i]) ans[i] = 0;
cout << S[ans[i]];
//if(ans[i] != 0){
// cout << ans[i] << " " << edges[i].first << " " << edges[i].second << "\n";
//}
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5120 KB |
Output is correct |
2 |
Correct |
7 ms |
5120 KB |
Output is correct |
3 |
Correct |
8 ms |
5248 KB |
Output is correct |
4 |
Correct |
8 ms |
5248 KB |
Output is correct |
5 |
Correct |
8 ms |
5120 KB |
Output is correct |
6 |
Correct |
8 ms |
5120 KB |
Output is correct |
7 |
Correct |
8 ms |
5248 KB |
Output is correct |
8 |
Correct |
8 ms |
5248 KB |
Output is correct |
9 |
Correct |
8 ms |
5120 KB |
Output is correct |
10 |
Correct |
8 ms |
5120 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5120 KB |
Output is correct |
2 |
Correct |
7 ms |
5120 KB |
Output is correct |
3 |
Correct |
8 ms |
5248 KB |
Output is correct |
4 |
Correct |
8 ms |
5248 KB |
Output is correct |
5 |
Correct |
8 ms |
5120 KB |
Output is correct |
6 |
Correct |
8 ms |
5120 KB |
Output is correct |
7 |
Correct |
8 ms |
5248 KB |
Output is correct |
8 |
Correct |
8 ms |
5248 KB |
Output is correct |
9 |
Correct |
8 ms |
5120 KB |
Output is correct |
10 |
Correct |
8 ms |
5120 KB |
Output is correct |
11 |
Correct |
51 ms |
10744 KB |
Output is correct |
12 |
Correct |
60 ms |
11768 KB |
Output is correct |
13 |
Correct |
69 ms |
12920 KB |
Output is correct |
14 |
Correct |
87 ms |
13892 KB |
Output is correct |
15 |
Correct |
98 ms |
14072 KB |
Output is correct |
16 |
Correct |
65 ms |
12280 KB |
Output is correct |
17 |
Correct |
86 ms |
14072 KB |
Output is correct |
18 |
Correct |
97 ms |
12792 KB |
Output is correct |
19 |
Correct |
84 ms |
14900 KB |
Output is correct |
20 |
Correct |
62 ms |
11640 KB |
Output is correct |
21 |
Correct |
59 ms |
11512 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5120 KB |
Output is correct |
2 |
Correct |
7 ms |
5120 KB |
Output is correct |
3 |
Correct |
8 ms |
5248 KB |
Output is correct |
4 |
Correct |
8 ms |
5248 KB |
Output is correct |
5 |
Correct |
8 ms |
5120 KB |
Output is correct |
6 |
Correct |
8 ms |
5120 KB |
Output is correct |
7 |
Correct |
8 ms |
5248 KB |
Output is correct |
8 |
Correct |
8 ms |
5248 KB |
Output is correct |
9 |
Correct |
8 ms |
5120 KB |
Output is correct |
10 |
Correct |
8 ms |
5120 KB |
Output is correct |
11 |
Correct |
51 ms |
10744 KB |
Output is correct |
12 |
Correct |
60 ms |
11768 KB |
Output is correct |
13 |
Correct |
69 ms |
12920 KB |
Output is correct |
14 |
Correct |
87 ms |
13892 KB |
Output is correct |
15 |
Correct |
98 ms |
14072 KB |
Output is correct |
16 |
Correct |
65 ms |
12280 KB |
Output is correct |
17 |
Correct |
86 ms |
14072 KB |
Output is correct |
18 |
Correct |
97 ms |
12792 KB |
Output is correct |
19 |
Correct |
84 ms |
14900 KB |
Output is correct |
20 |
Correct |
62 ms |
11640 KB |
Output is correct |
21 |
Correct |
59 ms |
11512 KB |
Output is correct |
22 |
Execution timed out |
3078 ms |
13560 KB |
Time limit exceeded |
23 |
Halted |
0 ms |
0 KB |
- |