==========
Questão 1
==========
Arquivo fonte: L4Q1.c | L4Q1.cpp | L4Q1.java
Arquivo de entrada: L4Q1.in
Arquivo de saída: L4Q1.out

O arquivo de entrada consiste de vários conjuntos de dados. Cada conjunto começa com uma linha contendo o número X de vértices do grafo. As próximas X linhas de cada conjunto contêm as listas de adjacências do grafo. O primeiro número de cada uma das X linhas é um inteiro N tal que 1 <= N <= X. Depois seguem vários pares de inteiros. Cada par possui um vértice V adjacente ao vértice N e o peso Pda aresta (N, V). A lista de pares termina quando o primeiro termo desse par é 0(zero) (esse par não deve ser considerado). Queremos identificar a árvore de menor custo desse grafo.
O arquivo de entrada é terminado por um conjunto de dados começando com X = 0. Esse conjunto não deve ser processado. Considere que 0 <= X <= 100 e que cada aresta tem peso maior que 0 e menor que 1000.

Entrada exemplo:
3
1  2 5  3 3  0
2  1 5  3 7  0
3  1 3  2 7  0
3
3  2 7  0
2  1 5  3 7  0
1  2 5  0
5
1  2 25  3 30  4 10  0
2  1 25  3 50  5 15  0
3  1 30  2 50  4 40  5 20  0
4  1 10  3 40  5  5  0
5  2 15  3 20  4  5  0
0

Para cada conjunto, você deve imprimir X + 2 linhas. Na primeira linha, imprima o número do conjunto de dado, como mostrado na saída exemplo. Na próxima linha, imprima o peso da árvore encontrada (soma dos pesos de todas as suas arestas). Nas próximas X linhas, imprima a nova lista de adjacências do grafo (árvore), sem os custos.
Note que podem existir várias respostas, dê preferência ao caminho com vértices de menor índice; para tanto, basta direcionar o heap de forma que dê prioridade ao menor índice.
Imprima uma linha em branco após cada conjunto.

Saída do exemplo acima:
Conjunto #1
Peso: 8
1  2  3
2  1
3  1

Conjunto #2
Peso: 12
1  2
2  1  3
3  2

Conjunto #3
Peso: 50
1  4
2  5
3  5
4  1  5
5  2  3  4





==========
Questão 2
==========
Arquivo fonte: L4Q2.c | L4Q2.cpp | L4Q2.java
Arquivo de entrada: L4Q2.in
Arquivo de saída: L4Q2.out

O arquivo de entrada consiste de vários conjuntos de dados. Cada conjunto começa com uma linha contendo o número X de vértices do grafo. As próximas X linhas de cada conjunto contém as listas de adjacências do grafo. O primeiro número de cada uma das X linhas é um inteiro N tal que 1 <= N <= X. Depois seguem  vários pares de inteiros. Cada par possui um vértice V adjacente ao vértice N e o peso da aresta (N,V). A lista de pares termina quando o primeiro termo desse par é 0(zero) (esse par não deve ser considerado). Após as X linhas, segue uma linha contendo um inteiro K que é um vértice do grafo. Queremos identificar as arestas que compõem os caminhos mais curtos de K para cada um dos vértices do grafo.
O arquivo de entrada é terminado por um conjunto de dados começando com X = 0. Esse conjunto não deve ser processado. Considere que 0 <= X <= 100 e que cada aresta tem peso maior que 0 e menor que 1000.

Entrada exemplo:
4
4  3 10  1  5  0
2  1  2  3  4  0
3  2  4  4 10  0
1  2  2  4  5  0
2
4
4  3  20  1 70  0
2  1 100  3 10  0
3  2  10  4 20  0
1  2 100  4 70  0
2
4
4  3  20  1  7  0
2  1 100  3 10  0
3  2  10  4 20  0
1  2 100  4  7  0
2
0

Para cada conjunto, você deve imprimir X linhas. Na primeira linha, imprima o número do conjunto de dado, como mostrado na saída exemplo. Nas próximas x-1 linhas imprima um par K -> V: (onde V é um vértice do grafo), o custo do melhor caminho até V e os vértices que compõem o melhor caminho para V.
Note que podem existir várias respostas, dê preferência ao caminho com vértices de menor índice; para tanto, basta direcionar o heap de forma que dê prioridade ao menor índice.
Imprima uma linha em branco após cada conjunto.

Saída do exemplo acima:
Conjunto #1
2 -> 1: Custo = 2 Caminho = 2 1
2 -> 3: Custo = 4 Caminho = 2 3
2 -> 4: Custo = 7 Caminho = 2 1 4

Conjunto #2
2 -> 1: Custo = 100 Caminho = 2 1
2 -> 3: Custo = 10 Caminho = 2 3
2 -> 4: Custo = 30 Caminho = 2 3 4

Conjunto #3
2 -> 1: Custo = 37 Caminho = 2 3 4 1
2 -> 3: Custo = 10 Caminho = 2 3
2 -> 4: Custo = 30 Caminho = 2 3 4





==========
Questão 3
==========
Arquivo fonte: L4Q3.c | L4Q3.cpp | L4Q3.java
Arquivo de entrada: L4Q3.in
Arquivo de saída: L4Q3.out

O arquivo de entrada consiste de vários conjuntos de duas seqüências de caracteres. Cada conjunto consiste em uma linha contendo duas strings do alfabeto Inglês com no máximo n e m caracteres, respectivamente. As duas strings podem estar separadas por um ou mais espaços em branco. Um conjunto em que as duas strings são "#" indica o final do arquivo. Cada caractere das strings serão minúsculos como no exemplo abaixo.

OBS: 0 <= n <= 100 e 0 <= m <= 100, n pode ser diferente de m

Entrada exemplo:

abcdefg abcdeh
bcd abcde
abcde bcgfe
# #
 

Para cada conjunto, você deve imprimir uma serie de linhas. Na primeira linha, imprima o numero do conjunto, como mostrado na saída exemplo. Na proxima linha imprima o custo "c" mínimo de edicao e nas próximas linhas quais os passos para transformar a cadeia A na cadeia B com este custo.

Os passos podem ser:
R c n - replace A[n] por c;
M c n - ocorreu match de c na posicao n de A;
D c n - delete c da posicao n de A;
I c n - insert c na posicao n de A.

Os passos devem ser apresentados na ordem inversa (como são identificados pelo retrocesso na matriz). Quando houver mais de uma possibilidade de movimento, a escolha deve obedecer à seguinte ordem de prioridades: (1) Match/Substituição, (2) Remoção, (3) Inserção.

Exemplo:

----------------
     A | B
----------------
M e 5 abcde  | bcgfe
I f 5 abcde  | bcgf
R g 4 abcdfe | bcg
M c 3 abcgfe | bc
M b 2 abcgfe | b
D a 1 abcgfe |
bcgfe | <-- A se transformou em B
 

Saída exemplo correspondente a entrada acima:
Conjunto #1
2
R h 7
D f 6
M e 5
M d 4
M c 3
M b 2
M a 1

Conjunto #2
-1
I e 4
M d 3
M c 2
M b 1
I a 1

Conjunto #3
-2
M e 5
R f 4
I g 4
M c 3
M b 2
D a 1
 





==========
Questão 4
==========
Arquivo fonte: L4Q4.c | L4Q4.cpp | L4Q4.java
Arquivo de entrada: L4Q4.in
Arquivo de saída: L4Q4.out

O arquivo de entrada consiste de vários conjuntos de duas seqüências de caracteres. Cada conjunto consiste em uma linha contendo duas strings do alfabeto Inglês com no máximo n e m caracteres, respectivamente. As duas strings podem estar separadas por um ou mais espaços em branco. Um conjunto em que as duas strings são "#" indica o final do arquivo. Cada caractere das strings será minúsculo como no exemplo abaixo.

OBS: 0 <= n <= 100 e 0 <= m <= 100, não pode ser diferente de m.

Entrada exemplo:

abca bcab
x b
ace abcde
# #

Para cada conjunto, você deve imprimir três linhas. Na primeira linha, imprima o numero do conjunto, como mostrado na saída exemplo. Na segunda, imprima uma maior subseqüência das duas seqüências e na terceira, uma menor supersequência. Caso alguma das subseqüências ou supersequências for vazia, imprima uma linha em branco.

Saída exemplo correspondente a entrada acima:

Conjunto #1
bca
abcab

Conjunto #2

bx

Conjunto #3
ace
abcde