home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
CataniaB
/
teach-act
/
testi-esami
/
labo-6.97
/
indegree.txt
< prev
Wrap
Text File
|
1999-03-11
|
3KB
|
143 lines
Esercitazione di Programmazione C
Giovedi' 5 Giugno 1997
Dato un grafo orientato G=(V,E), dove V e' l'insieme dei vertici
ed E l'insieme degli archi) si vuole calcolare il
grado in ingresso di ogni suo vertice v, cioe',
il numero di archi entranti in v.
Considerate un file "input" contenente i seguenti dati:
- un intero N che denota la cardinalita' di V in modo che
V sia uguale a 1,...,N;
- la sequenza di archi (nel file non e' indicata la cardinalita'
di E) ognuno indicato da una coppia di interi u v
(i.e., l'arco u -> v con u,v in V).
Utilizzando le liste di adiacenza per rappresentare
il grafo, scrivete un programma C che:
legge i dati del file "input" e costruisce il grafo
(cioe' inizializza la tabella di adiacenza);
calcola il grado di ingresso di ogni vertice;
stampa su video il grafo cioe': l'insieme dei vertici con
l'indicazione del grado, la lista degli archi e il numero
di archi del grafo.
Ad esempio dato il file "input"
4
1 2 3 1 1 3 1 3 1 4 4 2 3 1
l'output deve contenere le seguenti informazioni:
Vertici(con il grado tra parentesi): 1(2) 2(2) 3(1) 4(2)
Archi: (1 1)(1 4)(1 3)(1 2)(3 4)(3 1)(4 2)
Numero degli archi: 7
SOLUZIONE:
#include <stdio.h>
#include <string.h>
/* liste di adiacenza */
typedef struct cella* lista;
struct cella
{ int x;
lista next;
};
/* tabella di adiacenza:
per ogni vertice memorizzo il grado di ingresso
e la lista dei vertici adiacenti.
*/
struct vertice
{
int grado_in;
lista archi;
} Grafo[20];
/* Tutto nel programma principale */
main()
{
FILE *in;
int E,N; /* Numero archi(E) e vertici(N) */
int v,w,V,W;
lista aux;
in=fopen("input","r");
if (in==stdin) printf("Quanti vertici?[Max 20]");
fscanf(in,"%d",&N); /* Numero dei vertici: {1,...,N} */
for (v=0;v<=N;v++) /* Inizializzo le liste di adiacenza */
{
Grafo[v].archi=NULL;
Grafo[v].grado_in=0;
}
/* Lettura e inserimento (nella tabella di adiacenza) degli archi */
if (in==stdin) printf("Archi?[V W]\n");
while (fscanf(in,"%d %d",&V,&W)!=EOF)
if ((V<1 || V>N || W <1 || W>N) && in==stdin)
printf("Out of range\n");
else
{
aux=Grafo[V].archi;
/* Controllo se l'arco esiste gia */
while (aux!=NULL && aux->x != W) aux=aux->next;
/* Se non c'e' lo aggiungo alla lista di adiacenza di V */
if (aux==NULL)
{
aux=(lista)malloc(sizeof(struct cella));
aux->x=W;
aux->next=NULL;
aux->next=Grafo[V].archi;
Grafo[V].archi=aux;
E++;
}
}
/* Calcolo del grado in ingresso */
for (v=1;v<=N;v++)
for (w=1;w<=N;w++)
{
aux=Grafo[w].archi;
while(aux!=NULL)
if (aux->x !=v) aux=aux->next;
else
{
(Grafo[v].grado_in)++;
break; /* p[er hp v occorre al +1 volta nella LdA di w*/
}
}
/* Stampa del Grafo */
printf("Vertici(Grado):");
for (v=1;v<=N;v++)
printf("%d(%d) ",v,Grafo[v].grado_in);
printf("\nArchi:");
for (v=1;v<=N;v++)
{
aux=Grafo[v].archi;
while(aux!=NULL)
{
printf("(%d %d)",v,aux->x);
aux=aux->next;
}
}
printf("\nNo. archi:%d\n",E);
}