Corso di Informatica Generale - Primo modulo IN1

Testi e soluzioni di esercizi

 

Flussi di denaro

/*
**  flussi.c
**
**  I flussi di denaro tra le filiali di una banca sono rappresentati
**  mediante un grafo orientato. I vertici del grafo rappresentano le
**  diverse filiali e lo spigolo orientato v(i) --> v(j) indica che
**  c'e' un flusso dalla filiale v(i) alla filiale v(j). La quantita'
**  di denaro trasferito e' rappresentata mediante numeri interi
**  positivi associati agli spigoli del grafo.
**  Dopo aver rappresentato il grafo con liste di adiacenza costituite
**  da record con tre campi (il numero della filiale, il flusso
**  trasferito verso tale filiale ed il puntatore all'elemento
**  successivo), si stampi l'elenco delle filiali che al termine degli
**  spostamenti di denaro hanno aumentato il proprio capitale.
**
**  Marco Liverani (liverani@mat.uniroma3.it) - Giugno 2001
*/

#include <stdlib.h>
#include <stdio.h>

#define MAX 20

struct nodo {
  int info, importo;
  struct nodo *next;
};

struct nodo *leggi_lista(void) {
  struct nodo *p, *primo=NULL;
  int i, n, x, y;

  printf("Numero di elementi: ");
  scanf("%d", &n);
  for (i=0; i<n; i++) {
    printf("Numero della banca e importo: ");
    scanf("%d %d", &x, &y);
    p = malloc(sizeof(struct nodo));
    p->info = x;
    p->importo = y;
    p->next = primo;
    primo = p;
  }
  return(primo);
}

int leggi_grafo(struct nodo *l[]) {
  int i, n;

  printf("Numero di banche: ");
  scanf("%d", &n);
  for (i=0; i<n; i++)
    l[i] = leggi_lista();
  return(n);
}

int main(void) {
  struct nodo *lista[MAX], *p;
  int delta[MAX], i, n;

  n = leggi_grafo(lista);
  for (i=0; i<n; i++)
    delta[i] = 0;
  for (i=0; i<n; i++) {
    p = lista[i];
    while (p != NULL) {
      delta[i] = delta[i] - p->importo;
      delta[p->info] = delta[p->info] + p->importo;
      p = p->next;
    }
  }
  printf("Le banche che hanno aumentato il proprio capitale sono: ");
  for (i=0; i<n; i++) {
    if (delta[i]>0)
      printf("%d ", i);
  }
  printf("\n");
  return(1);
}

Per informazioni e commenti: liverani@mat.uniroma3.it - Torna alla Home page - Ultima modifica: 16 giugno 2001