Exercício cidades interligadas – complexo com matriz [incompleto]

Exercício bem interessante relacionado com a logística de transporte. Ele permite uma associação gráfica o que também é interessante, além de diversas partes, podendo ser selecionadas quais partes são de interesse (elas possuem nível de dificuldade variados).

Considere n cidades numeradas de 0 a n-1 que estão interligadas por uma série de estradas de mão única. As ligações entre as cidades são representadas pelos elementos de uma matriz quadrada  Lnxn, cujos elementos lij assumem o valor 1 ou 0, conforme exista ou não estrada direta que saia da cidade i e chegue à cidade j. Assim, os elementos da linha i indicam as estradas que saem da cidade i, e os elementos da coluna j indicam as estradas que chegam à cidade j.

Por convenção lii = 1. A figura mostra um exemplo para n = 4.

  • A) Dado k, determinar quantas estradas saem e quantas chegam à cidade k.
  • B) Dado k, verificar se todas as ligações diretas entre a cidade k e outras são de mão dupla.
  • C) Relacionar as cidades que possuem saídas diretas para a cidade k.
  • D) A qual das cidades chega o maior número de estradas?
#include <stdio.h>
#define TAM 4

int main() {
    int i, j, k, contIn=0, contOut=0, cont=0, contMaior=-1, cidadeMaior=-1;
    int L[TAM][TAM] = {1, 1, 1, 0,
                       0, 1, 1, 0,
                       1, 0, 1, 1,
                       0, 0, 1, 1};

    //A) Dado k, determinar quantas estradas saem e quantas chegam à cidade k.
    printf("Informe o numero da cidade (entre 0 e %d): ", TAM - 1);
    scanf("%d", &k);
    for (i = 0; i < TAM; i++) {
        if (k != i) { //desconsidera a própria cidade
            if (L[i][k] == 1) { contIn++; }
            if (L[k][i] == 1) { contOut++; }
        }
    }
    printf("%d estradas saem e %d estradas chegam\n", contOut, contIn);

    //B) Dado k, verificar se todas as ligações diretas entre a cidade k e outras são de mão dupla.
    for (i = 0; i < TAM; i++) {
        if (k != i) { //desconsidera a própria cidade
            if ((L[i][k] == 1) && (L[k][i] == 1)) {
                cont++;
            }
        }
    }
    printf("%d estradas de mao dupla\n", cont);

    //C) Relacionar as cidades que possuem saídas diretas para a cidade k.
    printf("Saidas diretas para a cidade: ");
    for (i = 0; i < TAM; i++) {
        if (k != i) { //desconsidera a própria cidade
            if (L[i][k] == 1) {
                printf("%i ", i);
            }
        }
    }
    printf("\n");

    //D) A qual das cidades chega o maior número de estradas?
    for (i = 0; i < TAM; i++) {
        cont = 0;
        for (j = 0; j < TAM; j++) {
            if (L[j][i] == 1) {
                    cont++;
            }
        }
        if (cont > contMaior) {
            contMaior = cont;
            cidadeMaior = i;
        }
    }
    printf("Cidade com maior numero de estradas: %d (com %d estradas)\n", cidadeMaior, contMaior-1);

    return 0;
}

================== Parte faltante do exercício ==============

E) Relacionar, se existirem cidades isoladas (cidades que não têm ligação com nenhuma outra) e cidades das quais não há saída.

F) Dada uma sequência de m inteiros cujos valores estão entre 0 e n-1, verificar se é possível realizar o roteiro correspondente. No exemplo dado, o roteiro representado pela sequência (m=5) 2 3 2 1 0 é impossível.

G) Dados k e p, determinar se é possível ir da cidade k para a cidade p pelas estradas existentes.

G.1) Qual o menor caminho entre as duas cidades?

H) Dado k, determinar se é possível, partindo de k, passar por todas as outras cidades apenas uma vez e retornar a k.

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.