Dado um gráfico acíclico direcionado , um vértice é uma fonte se seu indegree for zero, significando que ele possui apenas arcos de saída.
Existe um algoritmo de tempo linear para encontrar uma fonte em um determinado gráfico acíclico direcionado?
Pergunta de acompanhamento: Alguém em tempo linear pode encontrar todas as fontes?
algorithms
graph-theory
breezeintopl
fonte
fonte
Respostas:
Como Yuval menciona, a estrutura de dados é importante aqui. Vou tentar dar uma solução para alguns dos tipos de listas de adjacência:
Como observação lateral, se a escolha da estrutura de dados estiver em suas mãos, convém analisar o que todas as operações você pretende executar e com que frequência e escolher uma estrutura de dados apropriada.
Edit: Para o caso 1, se você tem um dag em que o número de fontes é muito pequeno em comparação com| V| (por exemplo, em uma árvore com uma fonte) e onde a distância média de qualquer vértice a uma fonte é pequena em comparação com| V| e você deseja apenas uma fonte, pode usar um algoritmo mais rápido, em média (embora a pior complexidade assintótica seja a mesma). Selecione qualquer vértice aleatoriamente e vá para qualquer um de seus pais (na lista de arestas recebidas) e depois para seu pai, etc., até chegar a um nó que não tem pai - uma fonte. Esse pequeno ganho de eficiência é para tipos muito limitados de gráficos com um algoritmo um pouco mais complexo.
fonte
Vamos considerar uma pergunta mais simples. Suponha que você saiba que seu gráfico é uma árvore. Então você pode encontrar o nó de origem em tempo linear. Basta selecionar um nó aleatório, se é a raiz, então você tem a sua resposta; caso contrário, deve ser filho ou pai e, em seguida, retroceder até chegar à raiz. Isso pode ser feito emO ( | V| -1) .
fonte
Supondo que você tenha um gráfico G = (V, E) fornecido no formato de lista de adjacências. (para ficar claro aqui, a lista contém todas as arestas de saída da fonte). Você pode construir o inverso do gráfico G em tempo linear. Em seguida, você pode percorrer o gráfico inverso e coletar todos os vértices que possuem a lista de adjacências vazia. Esses vértices não têm arestas de saída no gráfico inverso, o que significa que não têm arestas de entrada no gráfico original; portanto, esses são os vértices de origem.
O tempo de execução é linear. Construir o inverso do gráfico leva no máximo O (| V | + | E |). A iteração sobre o inverso do gráfico leva tempo O (| V |).
fonte