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;
}

浙公网安备 33010602011771号