Per risolvere il problema è conveniente passare dalla lista di adiacenza alla matrice di adiacenza del grafo.
Costruiamo una matrice di adiacenza di dimensione n \times n, dove l'elemento a_{ij} = 1, se esiste un arco orientato dal vertice al vertice , e in caso contrario.
Poi, per ogni vertice , contiamo il numero di archi entranti in esso. Questo si può fare sommando gli elementi della -esima colonna della matrice di adiacenza.
Un vertice è una sorgente se e solo se non entra in esso alcun arco, cioè la somma degli elementi della colonna corrispondente è uguale a .
Così, la risposta è il numero di vertici per i quali il numero di archi entranti è uguale a zero.
Esempio
Il grafo contiene una sorgente — il vertice , poiché in esso non entra alcun arco.
Implementazione dell'algoritmo
Dichiariamo la matrice di adiacenza e l'array , dove memorizza il numero di archi entranti nel vertice .
#define MAX 101
int g[MAX][MAX], in[MAX];Leggiamo i dati in ingresso. In base alla lista di adiacenza data, costruiamo la matrice di adiacenza.
scanf("%d", &n);
for (i = 1; i <= n; i++)
{Per ogni vertice leggiamo prima il numero di archi uscenti da esso.
scanf("%d", &k);
for (j = 0; j < k; j++)
{Per ogni arco impostiamo g[i][x] = 1.
scanf("%d", &x);
g[i][x] = 1;
}
}Scorriamo tutte le coppie di vertici del grafo. Per ogni arco incrementiamo il valore di di , poiché l'arco entra nel vertice .
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (g[i][j] == 1) in[j]++;Contiamo il numero di vertici-sorgente — cioè i vertici in cui non entra alcun arco (per i quali in[i] = 0).
int source = 0;
for (i = 1; i <= n; i++)
if (in[i] == 0) source++;Stampiamo la risposta.
printf("%d\n", source);