Semafori#993

Semafori (Editoriale)

Il sistema di incroci e tunnel definisce naturalmente un grafo: gli incroci sono i vertici, mentre i tunnel sono gli archi. Poiché i tunnel sono bidirezionali, il grafo è non orientato.

Il numero di semafori da installare al -esimo incrocio è pari al grado del vertice , ovvero al numero di tunnel incidenti a tale incrocio.

Creiamo un array , dove — è il numero di tunnel adiacenti al -esimo incrocio. Allora, per ogni arco non orientato , è necessario incrementare di uno i valori e .

Esempio

Il grafo riportato nell'esempio ha il seguente aspetto:

Implementazione dell'algoritmo

Dichiariamo un array , in cui memorizzeremo le informazioni sui tunnel.

#define MAX 110
int ton[MAX];

Leggiamo i dati in input. Elaboriamo in sequenza ciascun tunnel, incrementando i gradi dei vertici corrispondenti del grafo.

scanf("%d %d",&n,&m);
memset(ton,0,sizeof(ton));
for (i = 0; i < m; i++)
{
  scanf("%d %d",&a,&b);
  ton[a]++; ton[b]++;
}

Stampiamo il numero di semafori necessari per ciascun incrocio.

for (i = 1; i <= n; i++)
  printf("%d ",ton[i]);
printf("\n");