#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int mx = 10'000;
using vi = vector<int>;
struct disjoint_set
{
public:
vi parent = vi(1+mx);
vi subtree = vi(1+mx, 1);
disjoint_set()
{
for(int i = 1; i <= mx; i++) parent[i] = i;
}
int root(int u)
{
if(parent[u] == u) return u;
else return (parent[u] = root(parent[u]));
}
bool join(int u, int v)
{
u = root(u);
v = root(v);
if(u == v) return 0;
if(subtree[u] < subtree[v]) swap(u, v);
parent[v] = u;
subtree[u] += subtree[v];
return 1;
}
};
vi edge[1+mx];
void add_edge(int u, int v)
{
edge[u].push_back(v);
edge[v].push_back(u);
// cerr << "adding edge " << u << ' ' << v << '\n';
}
vi rev_edge[1+mx];
vi visit(1+mx, 0);
vi ee;
void dfs(int u, int p)
{
// cerr << "dfs enter " << u << '\n';
visit[u] = 1;
int cont = 0;
for(int v: edge[u])
{
if(cont == 0 && v == p)
{
cont++;
continue;
}
if(visit[v])
{
rev_edge[v].push_back(u);
}
else
{
rev_edge[v].push_back(u);
dfs(v, u);
}
}
ee.push_back(u);
// cerr << "dfs exit " << u << '\n';
}
int ct = 0;
vi bcc(1+mx, 0);
void dfs2(int u)
{
bcc[u] = ct;
for(int v: rev_edge[u])
{
if(bcc[v]) continue;
dfs2(v);
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, M;
cin >> N >> M;
disjoint_set A;
disjoint_set B;
for(int e = 1; e <= M; e++)
{
int u, v;
cin >> u >> v;
if(A.join(u, v)) add_edge(u, v);
else if(B.join(u, v)) add_edge(u, v);
}
for(int u = 1; u <= N; u++)
{
if(visit[u]) continue;
dfs(u, 0);
}
reverse(ee.begin(), ee.end());
for(int u: ee)
{
if(bcc[u]) continue;
ct++;
dfs2(u);
}
for(int u = 1; u <= N; u++)
for(int v: rev_edge[u])
if(bcc[u] != bcc[v])
cout << u << ' ' << v << '\n';
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
972 KB |
Output is correct |
2 |
Correct |
1 ms |
972 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
1484 KB |
Output is correct |
2 |
Correct |
4 ms |
1356 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
78 ms |
1408 KB |
Output is correct |
2 |
Correct |
82 ms |
1276 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
160 ms |
2168 KB |
Output is correct |
2 |
Correct |
197 ms |
1772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
1 ms |
1868 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
2 ms |
1868 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
2 ms |
1868 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
2 ms |
1868 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
2 ms |
1868 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3 ms |
1868 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |