답안 #169474

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
169474 2019-12-20T15:03:46 Z Andrei_Cotor Pipes (CEOI15_pipes) C++14
0 / 100
5000 ms 5880 KB
#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(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;
    }
    else
    {
        SzLink[y]+=SzLink[x];
        ParLink[x]=y;
    }
}

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 Execution timed out 5093 ms 2680 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5016 ms 2908 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5091 ms 2936 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5069 ms 3064 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5062 ms 3576 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5098 ms 5112 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5024 ms 5112 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5025 ms 5880 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5099 ms 5880 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5032 ms 5624 KB Time limit exceeded
2 Halted 0 ms 0 KB -