Ciclos, ordem topológica e conetividade
Tempos de descoberta, low-link, componentes fortes, pontes e pontos de articulação.
Ciclo e ordem
Dirigido usa branco, cinzento e preto. Aresta para cinzento fecha ciclo; para preto não prova nada. Não dirigido ignora só a aresta de entrada; paralelas pedem IDs.
Ordem topológica põe u antes de v em cada u->v. Só existe em DAG.
| Método | Faz | Falha quando |
|---|---|---|
| DFS | Ordena por saída decrescente | Encontra ciclo |
| Kahn | Retira um vértice com grau de entrada zero; por cada aresta de saída, decrementa o grau de entrada do destino e põe na fila os que chegam a zero | Retira menos de V |
Ambos custam . Ordem única só quando Kahn tem uma escolha em cada passo.
Fortes com Tarjan
Uma componente fortemente ligada tem caminho nos dois sentidos entre qualquer par e é máxima com essa propriedade. Contrair cada componente dá um DAG.
- Quando descobres
u, definedisc[u]=low[u]com o contador atual e empilhau. - Para cada aresta
u->vna DFS: sevé filho na árvore, fazlow[u]=min(low[u],low[v])depois da chamada; sevjá está na pilha de componentes, fazlow[u]=min(low[u],disc[v]). - Quando
low[u]==disc[u], retira da pilha atéu: é uma componente fechada.
Pilha de componentes não é a pilha de chamadas.
- Fecha 1low[1]=0; continua na pilha.
chamadas: 0componentes: 0, 1 - 2 vê 1Propaga disc[1], porque 1 ainda está na pilha de componentes.
chamadas: 0, 2componentes: 0, 1, 2 - Fecha 0low[0]=disc[0] encerra.
SCC: 0, 1, 2
Pontes e articulações
Grafo não dirigido. Ponte aumenta componentes ao sair; articulação ao sair com as suas arestas.
| Procura | Condição sobre a aresta da árvore u->v |
|---|---|
Ponte u-v | low[v]>disc[u] |
| Não raiz articula | Algum filho v com low[v]>=disc[u] |
| Raiz articula | Dois ou mais filhos na DFS |
Aqui u é o extremo mais próximo da raiz e v o filho na árvore DFS. low propaga-se pelos filhos e por uma aresta de retorno para um antepassado ainda na pilha. A igualdade evita a ponte mas ainda pode articular. Arestas paralelas eliminam a ponte.