Gli esercizi
Testi e soluzioni di alcuni 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(0);
}