#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;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
2680 KB |
Output is correct |
2 |
Correct |
4 ms |
2680 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
3064 KB |
Output is correct |
2 |
Correct |
8 ms |
3064 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
135 ms |
2940 KB |
Output is correct |
2 |
Correct |
133 ms |
3024 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
228 ms |
3448 KB |
Output is correct |
2 |
Correct |
270 ms |
3448 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
420 ms |
4472 KB |
Output is correct |
2 |
Correct |
354 ms |
4908 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
564 ms |
7992 KB |
Output is correct |
2 |
Correct |
489 ms |
7928 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
866 ms |
8700 KB |
Output is correct |
2 |
Correct |
833 ms |
8696 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1127 ms |
10104 KB |
Output is correct |
2 |
Correct |
1106 ms |
10284 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1426 ms |
10124 KB |
Output is correct |
2 |
Correct |
1383 ms |
10384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1774 ms |
9772 KB |
Output is correct |
2 |
Correct |
1696 ms |
10044 KB |
Output is correct |