#include <iostream>
#include <vector>
#define DIM 100002
using namespace std;
int t[DIM],t2[DIM],viz[DIM],low[DIM],niv[DIM];
vector <int> L[DIM];
int n,m,i,j,x,y;
inline int get_rad (int x){
int nr = x;
while (t[x] > 0)
x = t[x];
while (t[nr] > 0){
int aux = t[nr];
t[nr] = x;
nr = aux;
}
return x;
}
inline int get_rad2 (int x){
int nr = x;
while (t2[x] > 0)
x = t2[x];
while (t2[nr] > 0){
int aux = t2[nr];
t2[nr] = x;
nr = aux;
}
return x;
}
void dfs(int nod, int tata){
viz[nod] = 1;
niv[nod] = niv[tata] + 1;
low[nod] = niv[nod];
for(int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if(vecin == tata)
continue;
if(viz[vecin] == 1)
low[nod] = min(low[nod],niv[vecin]);
else {
dfs (vecin, nod);
low[nod] = min(low[nod],low[vecin]);
if (low[vecin] >= niv[nod])
cout<<nod<<" "<<vecin<<"\n";
}}}
void dfs (int nod){
viz[nod] = 1;
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (!viz[vecin]){
if (t2[nod] == -1 && t2[vecin] == -1)
cout<<nod<<" "<<vecin<<"\n";
dfs (vecin);
}}}
int main (){
cin>>n>>m;
for (i=1;i<=n;i++)
t[i] = t2[i] = -1;
for (i=1;i<=m;i++){
cin>>x>>y;
int rx = get_rad (x), ry = get_rad (y);
if (rx != ry){
L[x].push_back(y);
L[y].push_back(x);
if (t[rx] < t[ry]){
t[rx] += t[ry];
t[ry] = rx;
} else {
t[ry] += t[rx];
t[rx] = ry;
}
} else {
/// nodurile se alfa deja in aceeasi multime si toate muchiile
/// de pe drumul de la x la y NU pot fi critice
/// oare merge daca fac din nou paduri pt nodurile astea?
int rx2 = get_rad2 (x), ry2 = get_rad2 (y);
if (rx2 != ry2){
L[x].push_back(y); /// astea ar fi muchiile de intoarcere pt biconexe
L[y].push_back(x);
if (t2[rx2] < t2[ry2]){
t2[rx2] += t2[ry2];
t2[ry2] = rx2;
} else {
t2[ry2] += t2[rx2];
t2[rx2] = ry2;
}}}}
for (i=1;i<=n;i++)
if (!viz[i])
dfs (i,0);
return 0;
}
Compilation message
pipes.cpp: In function 'void dfs(int, int)':
pipes.cpp:34:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<L[nod].size();i++){
~^~~~~~~~~~~~~~
pipes.cpp: In function 'void dfs(int)':
pipes.cpp:48:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i=0;i<L[nod].size();i++){
~^~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
2680 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
15 ms |
3192 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
502 ms |
3020 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
873 ms |
3700 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1450 ms |
5272 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1863 ms |
10184 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2971 ms |
11312 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4113 ms |
13388 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
5026 ms |
13380 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
5007 ms |
7184 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |