Desenvolver um programa em C++ para resolver problemas de otimização em grafos temporais, focando na infraestrutura de uma nação fictícia chamada Baicônia. O programa deve calcular a distância mínima do palácio real para cada vila, o primeiro ano de alcançabilidade total e o menor custo de conectividade.
- Grafo Temporal: Grafo em que as arestas (conexões) têm tempos específicos de ativação.
- Alcançabilidade: Capacidade de atingir todas as vilas a partir do palácio real em um determinado ano.
- Conectividade: Garantia de que todas as vilas estão conectadas com o menor custo possível.
- N: Número de vilas.
- M: Número de conexões.
- Conexões: Cada conexão é descrita por cinco inteiros (u), (v), (a), (l) e (c), onde:
- (u) e (v): Vilas conectadas.
- (a): Ano de conclusão da construção da via.
- (l): Tempo de travessia em horas.
- (c): Custo de construção em baconzitos.
- Distâncias mínimas do palácio real para cada vila.
- Primeiro ano em que todas as vilas são alcançáveis a partir do palácio real.
- Menor custo para conectar todas as vilas.
Entrada:
4 4
1 2 3 4 5
2 3 5 6 7
3 4 7 1 2
4 1 2 3 4
Saída:
0
4
4
7
5
11
- Ler N (número de vilas) e M (número de conexões).
- Ler as próximas M linhas com as informações das conexões: (u), (v), (a), (l), e (c).
- Utilizar uma estrutura adequada para armazenar o grafo, como listas de adjacência, levando em conta os tempos de ativação das arestas.
- Implementar um algoritmo (como Dijkstra) para calcular a distância mínima do palácio real para cada vila.
- Analisar os anos de ativação das arestas para encontrar o primeiro ano em que todas as vilas são alcançáveis.
- Implementar um algoritmo (como Kruskal ou Prim) para calcular o menor custo necessário para garantir a conectividade entre todas as vilas.
- Validar seu programa com os casos de teste fornecidos e criar novos casos para garantir a corretude do programa.
- Garantir que seu programa atende aos requisitos de tempo (3 segundos por caso de teste) e memória (100MB).
-
Estrutura de Dados para o Grafo:
- Utilize listas de adjacência para armazenar conexões.
-
Funções de Algoritmos:
- Dijkstra: Para calcular distâncias mínimas.
- Kruskal/Prim: Para calcular o menor custo de conectividade.
- Comente seu código para facilitar a leitura e a manutenção.
- Certifique-se de seguir as restrições de tempo e memória.
- Faça testes exaustivos com diferentes grafos para garantir a correção do seu programa.