cf118 E. Bertown roads(双连通分量,tarjan判桥)

题意:

把一个无向连通图变成有向连通图。数据没有重边。

思路:

跑tarjan,如果存在桥就一定没有答案,否则记录一下答案。

没有重边就很舒服。把不在搜索树上的往前指的边都变成反向边,别重复

const int N = 1e5 + 5;
int n, m;
vector<int> G[N];

int dfn[N], low[N], num;
vector<PII> ans;
void tarjan(int u, int fa)
{
    dfn[u] = low[u] = ++num;
    for(int v : G[u]) if(v != fa)
    {
        if(!dfn[v])
        {
            tarjan(v, u); low[u] = min(low[u], low[v]), ans.pb({u,v});
            if(low[v] > dfn[u]) puts("0"), exit(0);
        }
        else
        {
            low[u] = min(low[u], dfn[v]);
            if(dfn[v] < dfn[u]) ans.pb({u,v}); //别重复计算
        }
    }
}

main()
{
    iofast;
    cin >> n >> m;
    while(m--)
    {
        int a, b; cin >> a >> b;
        G[a].pb(b), G[b].pb(a);
    }

    tarjan(1, 0);

    for(auto [u,v] : ans) cout << u << ' ' << v << endl;
}

posted @ 2022-03-06 20:41  Bellala  阅读(54)  评论(0)    收藏  举报