45 lines
1.5 KiB
TeX
45 lines
1.5 KiB
TeX
\documentclass[10pt]{article}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage{amsmath,amsthm,amssymb}
|
|
\usepackage{fullpage}
|
|
\usepackage{url}
|
|
\pagenumbering{gobble}
|
|
\usepackage{hyperref}
|
|
|
|
\title{ Tutorial: Quase Menor Caminho}
|
|
\author{SPOJ Brasil}
|
|
\date{}
|
|
\begin{document}
|
|
\maketitle
|
|
Uma forma direta de resolver o problema e remover todas as arestas que pertencem
|
|
a algum menor caminho original e, depois, calcular novamente o menor caminho.
|
|
|
|
Primeiro rodamos Dijkstra a partir de $S$ no grafo original, obtendo
|
|
$distS[u]$, a menor distancia de $S$ ate cada vertice $u$. Em seguida rodamos
|
|
Dijkstra no grafo reverso a partir de $D$, obtendo $distD[u]$, a menor
|
|
distancia de $u$ ate $D$ no grafo original.
|
|
|
|
Se $distS[D]$ for infinito, nao existe caminho de $S$ ate $D$ e a resposta ja e
|
|
$-1$.
|
|
|
|
Caso contrario, uma aresta direcionada $(u, v)$ de peso $p$ pertence a algum
|
|
menor caminho de $S$ ate $D$ se, e somente se:
|
|
|
|
\[
|
|
distS[u] + p + distD[v] = distS[D].
|
|
\]
|
|
|
|
Essa igualdade diz que existe um menor caminho formado por um menor caminho de
|
|
$S$ ate $u$, seguido pela aresta $(u, v)$, seguido por um menor caminho de $v$
|
|
ate $D$. Portanto, marcamos todas as arestas que satisfazem essa condicao como
|
|
removidas.
|
|
|
|
Por fim, rodamos Dijkstra mais uma vez a partir de $S$, ignorando as arestas
|
|
removidas. A distancia obtida ate $D$ e o quase menor caminho; se ela for
|
|
infinita, imprimimos $-1$.
|
|
|
|
Cada execucao de Dijkstra custa $O((N+M)\log N)$. Como usamos tres execucoes, a
|
|
complexidade total por caso de teste e $O((N+M)\log N)$ em tempo e $O(N+M)$ em
|
|
memoria.
|
|
\end{document}
|