제출 #246942

#제출 시각아이디문제언어결과실행 시간메모리
246942oolimryOne-Way Streets (CEOI17_oneway)C++14
100 / 100
126 ms14348 KiB
#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);
		}
	}
}

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 = 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){
			if(depth[s] >= depth[t]){
				if(!pathCompressed[s]) label[s] = labelS;
				pathCompressed[s] = true;
				nodes.push_back(s);
				s = p[s];
			}
			else{
				if(!pathCompressed[t]) label[t] = labelT;
				pathCompressed[t] = true;
				nodes.push_back(t);
				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;
		
		int a = edges[e].first;
		int b = edges[e].second;
		
		bool swapped = false;
		
		if(depth[a] > depth[b]){
			swap(a, b);
			swapped = true;
		}
				
		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]];
	}
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...