#include<iostream>
#include<vector>
using namespace std;
int ParLink[100005],P[100005],Lev[100005],Sz[100005],Low[100005],Covered[100005],Prv[100005],SzLink[100005];
pair<int,int> Edge[100005];
vector<pair<int,int> > A[100005];
int parentLink(int x)
{
int cx=x;
while(ParLink[x]!=0)
x=ParLink[x];
while(ParLink[cx]!=0)
{
int aux=ParLink[cx];
ParLink[cx]=x;
cx=aux;
}
return x;
}
void uniLink(int x, int y)
{
x=parentLink(x);
y=parentLink(y);
if(x==y)
return;
if(SzLink[x]>SzLink[y])
{
SzLink[x]+=SzLink[y];
ParLink[y]=x;
if(Lev[Low[y]]<Lev[Low[x]])
Low[x]=Low[y];
}
else
{
SzLink[y]+=SzLink[x];
ParLink[x]=y;
if(Lev[Low[x]]<Lev[Low[y]])
Low[y]=Low[x];
}
}
void dfs(int nod, int p, int lev, int px)
{
P[nod]=px;
Lev[nod]=lev;
for(auto other:A[nod])
if(other.first!=p)
{
Prv[other.first]=other.second;
dfs(other.first,nod,lev+1,px);
Low[parentLink(other.second)]=nod;
}
}
void unite(int x, int y, int nr)
{
int px=P[x];
int py=P[y];
if(Sz[px]<Sz[py])
{
swap(x,y);
swap(px,py);
}
Sz[px]+=Sz[py];
A[x].push_back({y,nr});
A[y].push_back({x,nr});
Prv[y]=nr;
Low[nr]=x;
ParLink[nr]=0;
SzLink[nr]=1;
dfs(y,x,Lev[x]+1,px);
}
void update(int x, int y)
{
int prvLinkx=0;
int prvLinky=0;
while(x!=y)
{
if(Lev[x]<Lev[y])
{
swap(x,y);
swap(prvLinkx,prvLinky);
}
Covered[Prv[x]]=1;
if(prvLinkx!=0)
uniLink(Prv[x],prvLinkx);
prvLinkx=Prv[x];
x=Low[parentLink(Prv[x])];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
Sz[i]=1;
P[i]=i;
Lev[i]=1;
}
int nr=0;
for(int i=1; i<=m; i++)
{
int x,y;
cin>>x>>y;
if(P[x]!=P[y])
{
nr++;
Edge[nr]={x,y};
unite(x,y,nr);
}
else
update(x,y);
}
for(int i=1; i<=nr; i++)
if(!Covered[i])
cout<<Edge[i].first<<" "<<Edge[i].second<<"\n";
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
4 ms |
2680 KB |
Output is correct |
2 |
Correct |
4 ms |
2680 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
8 ms |
3192 KB |
Output is correct |
2 |
Correct |
8 ms |
3192 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
136 ms |
8428 KB |
Output is correct |
2 |
Correct |
136 ms |
8312 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
263 ms |
13080 KB |
Output is correct |
2 |
Correct |
277 ms |
14816 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
415 ms |
20656 KB |
Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
539 ms |
28616 KB |
Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
837 ms |
15108 KB |
Output is correct |
2 |
Correct |
841 ms |
14896 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1159 ms |
19320 KB |
Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1427 ms |
25420 KB |
Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1703 ms |
38120 KB |
Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |
2 |
Halted |
0 ms |
0 KB |
- |