Submission #1203866

#TimeUsernameProblemLanguageResultExecution timeMemory
120386612345678Pipes (CEOI15_pipes)C++20
0 / 100
660 ms13984 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=1e5+5;

int n, m, u, v, sz[nx], dsu1[nx], dsu2[nx], low[nx], disc[nx], t;
vector<int> d[nx];

int find1(int x)
{
    if (dsu1[x]==x) return x;
    return dsu1[x]=find1(dsu1[x]);
}

int find2(int x)
{
    if (dsu2[x]==x) return x;
    return dsu2[x]=find2(dsu2[x]);
}

void dfs(int u, int p)
{
    low[u]=disc[u]=++t;
    for (auto v:d[u])
    {
        if (v==p) continue;
        if (!disc[v]) dfs(v, u), low[u]=min(low[u], low[v]);
        else low[u]=min(low[u], disc[v]);
    }
    if (low[u]==disc[u]&&u!=1) cout<<u<<' '<<p<<'\n';
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<=n ;i++) dsu1[i]=dsu2[i]=i;
    for (int i=1; i<=m; i++)
    {
        cin>>u>>v;
        if (find1(u)!=find1(v))
        {
            dsu1[find1(u)]=find1(v);
            d[u].push_back(v);
            d[v].push_back(u);
        }
        else if (find2(u)!=find2(v))
        {
            dsu2[find2(u)]=find2(v);
            d[u].push_back(v);
            d[v].push_back(u);
        }
    }
    for (int i=1; i<=n; i++) if (!disc[i]) dfs(i, i);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...