Conteggio delle sorgenti#10482

Conteggio delle sorgenti (Editoriale)

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);