Submission #1203873

#TimeUsernameProblemLanguageResultExecution timeMemory
120387312345678Pipes (CEOI15_pipes)C++20
100 / 100
625 ms16236 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=1e5+5;

int n, m, u, v, dsu1[nx], dsu2[nx], t, rt;
vector<pair<int ,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, int pidx)
{
    dsu1[u]=dsu2[u]=++t;
    for (auto [v, idx]:d[u])
    {
        if (idx==pidx) continue;
        if (!dsu1[v]) dfs(v, u, idx), dsu2[u]=min(dsu2[u], dsu2[v]);
        else dsu2[u]=min(dsu2[u], dsu1[v]);
    }
    if (dsu1[u]==dsu2[u]&&u!=rt) 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, i});
            d[v].push_back({u, i});
        }
        else if (find2(u)!=find2(v))
        {
            dsu2[find2(u)]=find2(v);
            d[u].push_back({v, i});
            d[v].push_back({u, i});
        }
    }
    for (int i=1; i<=n; i++) dsu1[i]=dsu2[i]=0;
    for (int i=1; i<=n; i++) if (!dsu1[i]) rt=i, dfs(i, i, -1);
}
#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...