제출 #1027348

#제출 시각아이디문제언어결과실행 시간메모리
1027348khanhphucscratchOne-Way Streets (CEOI17_oneway)C++14
100 / 100
233 ms44228 KiB
#include<bits/stdc++.h>
using namespace std;
set<pair<int, int>> edges;
map<pair<int, int>, int> f;
map<pair<int, int>, pair<int, int>> edge_tree_to_graph;
vector<pair<int, int>> bridges;
vector<int> ad[100005], ad2[100005];
int low[100005], num[100005], c[100005], dp[100005], ans[100005], dfsc = 0, color = 0;
//0 = B; 1 = L; 2 = R;
bool visited[100005];
inline pair<int, int> edgeCorrection(pair<int, int> x)
{
    if(edges.count(x) == 0) swap(x.first, x.second);
    return x;
}
void dfs(int u, int par)
{
    low[u] = num[u] = ++dfsc;
    bool avoidpar = 1;
    for(int v : ad[u]){
        if(v != par || avoidpar == 0){
            if(num[v] > 0) low[u] = min(low[u], num[v]);
            else{
                dfs(v, u);
                low[u] = min(low[u], low[v]);
            }
        }
        else avoidpar = 0;
    }
}
void dfscolor(int u, int co)
{
    //cout<<"A"<<u<<" "<<color<<endl;
    visited[u] = 1; c[u] = co;
    for(int v : ad[u]) if(visited[v] == 0){
        if(low[v] == num[v]){
            dfscolor(v, ++color);
            bridges.push_back(edgeCorrection({u, v}));
        }
        else dfscolor(v, co);
    }
}
void dfsdirect(int u)
{
    visited[u] = 1;
    for(int v : ad2[u]) if(visited[v] == 0){
        //if(u == c[4]) cout<<"B"<<v<<endl;
        dfsdirect(v); dp[u] += dp[v];
        if(dp[v] != 0){
            //if(v == c[4]) cout<<"B"<<u<<" "<<v<<endl;
            pair<int, int> thisedge = edge_tree_to_graph[{u, v}];
            if(dp[v] > 0){
                if(c[thisedge.first] == u) ans[f[thisedge]] = 1;
                else ans[f[thisedge]] = 2;
            }
            else{
                if(c[thisedge.first] == u) ans[f[thisedge]] = 2;
                else ans[f[thisedge]] = 1;
            }
        }
    }
    //cout<<u<<" "<<dp[u]<<endl;
}
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 u, v;
        cin>>u>>v;
        if(u == v) continue;
        ad[u].push_back(v);
        ad[v].push_back(u);
        edges.insert({u, v});
        f[{u, v}] = i;
    }
    for(int i = 1; i <= n; i++) if(num[i] == 0){
        dfs(i, -1);
        color++;
        dfscolor(i, color);
    }
    for(pair<int, int> i : bridges){
        ad2[c[i.first]].push_back(c[i.second]);
        ad2[c[i.second]].push_back(c[i.first]);
        edge_tree_to_graph[{c[i.first], c[i.second]}] = i;
        edge_tree_to_graph[{c[i.second], c[i.first]}] = i;
    }
    int p; cin>>p;
    for(int i = 1; i <= p; i++){
        int u, v;
        cin>>u>>v;
        dp[c[u]]++; dp[c[v]]--;
    }
    //cout<<"A"<<dp[c[4]]<<endl;
    memset(visited, 0, sizeof(visited));
    for(int i = 1; i <= color; i++) if(visited[i] == 0){
        dfsdirect(i);
    }
    for(int i = 1; i <= m; i++){
        if(ans[i] == 0) cout<<"B";
        else if(ans[i] == 1) cout<<"L";
        else cout<<"R";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...