이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
int n, m, p;
int a[100005], b[100005], poc[100005], kraj[100005];
vector <pair <int, int> > v[100005];
vector <pair <int, int> > e[100005];
int dt[100005], ft[100005], lw[100005];
int most[100005], blok[100005];
int brojac = 1;
int br1 = 1, br2 = 1;
int parent[100005];
int rez[100005];
map <int, bool> mp[100005];
map <int, bool> :: iterator it;
int find (int x){
if (parent[x] == x){
return x;
}
return parent[x] = find(parent[x]);
}
void unite (int x, int y){
int px = find(parent[x]);
int py = find(parent[y]);
if (px == py){
return;
}
if (mp[x].size() > mp[y].size()){
swap(px, py);
}
for (auto i : mp[px]){
if (mp[py][i.first] == 1){
mp[py].erase(i.first);
}
else{
mp[py][i.first] = 1;
}
}
/*
while (mp[px].size() > 0){
//mp[px].begin();
it = mp[px].begin();
mp[py][it -> first]++;
if (mp[py][it -> first] == 2){
mp[py].erase(it -> first);
}
mp[px].erase(mp[px].begin());
}
*/
parent[px] = py;
return;
}
void dfs (int x, int p, int cesta){
//cout << " aaa " << x << " " << p << endl;
blok[x] = brojac;
lw[x] = dt[x];
for (int i = 0; i < v[x].size(); i++){
int x_novi = v[x][i].first;
int in = v[x][i].second;
if (dt[x_novi] == 0 and cesta != in and x != x_novi){
e[x].push_back(make_pair(x_novi, in));
dt[x_novi] = br1;
parent[x_novi] = x_novi;
br1++;
dfs(x_novi, x, in);
lw[x] = min(lw[x], lw[x_novi]);
}
else
if (cesta != in and x != x_novi){
lw[x] = min(lw[x], dt[x_novi]);
}
}
if (cesta != -1 and lw[x] == dt[x]){
most[cesta] = 1;
}
ft[x] = br2;
br2++;
return;
}
void dfs2 (int x, int cesta){
for (int i = 0; i < e[x].size(); i++){
int x_novi = e[x][i].first;
int in = e[x][i].second;
dfs2(x_novi, in);
unite(x, x_novi);
}
int px = find(x);
if (cesta != -1 and mp[px].size() > 0){
for (auto i : mp[px]){
rez[cesta] = i.first;
break;
}
}
return;
}
int main (void){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 1; i <= m; i++){
cin >> a[i] >> b[i];
v[a[i]].push_back(make_pair(b[i], i));
v[b[i]].push_back(make_pair(a[i], i));
}
for (int i = 1; i <= n; i++){
if (blok[i] == 0){
blok[i] = brojac;
br1 = 1, br2 = 1;
dt[i] = 1;
br1++;
parent[i] = i;
dfs(i, 0, -1);
brojac++;
}
}
/*
for (int i = 1; i <= n; i++){
cout << blok[i] << endl;
cout << i << " : ";
for (int j = 0; j < e[i].size(); j++){
cout << e[i][j].first << " ";
}
cout << endl;
}
*/
cin >> p;
for (int i = 1; i <= p; i++){
cin >> poc[i] >> kraj[i];
if (poc[i] != kraj[i]){
mp[poc[i]][i] = 1;
mp[kraj[i]][i] = 1;
}
}
brojac = 1;
for (int i = 1; i <= n; i++){
if (blok[i] == brojac){
dfs2(i, -1);
brojac++;
}
}
//cout << "aaa" << endl;
//dfs2(1, -1);
for (int i = 1; i <= m; i++){
if (rez[i] == 0 or most[i] == 0){
cout << "B";
}
else{
int k = kraj[rez[i]];
int p = poc[rez[i]];
//cout << a[i] << " " << b[i] << " " << p << " " << k << endl;
if ((dt[a[i]] < dt[b[i]] and dt[b[i]] <= dt[k] and ft[b[i]] >= ft[k]) or (dt[a[i]] > dt[b[i]] and dt[a[i]] <= dt[p] and ft[a[i]] >= ft[p])){
cout << "R";
}
else{
cout << "L";
}
}
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
oneway.cpp: In function 'void dfs(int, int, int)':
oneway.cpp:64:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
64 | for (int i = 0; i < v[x].size(); i++){
| ~~^~~~~~~~~~~~~
oneway.cpp: In function 'void dfs2(int, int)':
oneway.cpp:89:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
89 | for (int i = 0; i < e[x].size(); i++){
| ~~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |