Pioggia colorata#994

Pioggia colorata (Editoriale)

Il problema si riduce all'analisi di un grafo non orientato, definito da una matrice di adiacenza.

Le colline sono considerate come i vertici del grafo, e i ponti — come gli archi tra di essi. La matrice di adiacenza g[i][j] indica se esiste un ponte tra i vertici e . Il colore della -esima collina è specificato nella cella dell'array .

Nel problema è necessario trovare il numero di ponti "cattivi". Un ponte è considerato cattivo se collega due colline di colore diverso, cioè se per l'arco è soddisfatta la condizione col[i] \ne col[j].

Poiché il grafo è non orientato, ogni arco viene considerato una sola volta, quindi si considerano solo le coppie dove .

Implementazione dell'algoritmo

Dichiariamo la matrice di adiacenza e l'array dei colori .

#define MAX 110
int g[MAX][MAX], col[MAX];

Leggiamo la matrice di adiacenza del grafo.

scanf("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
  scanf("%d", &g[i][j]);

Leggiamo l'array dei colori delle colline.

for (i = 0; i < n; i++)
  scanf("%d", &col[i]);

Contiamo nella variabile il numero di tali coppie di colline , tra le quali esiste un ponte (g[i][j] = 1) e per le quali col[i] \ne col[j].

res = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
  if ((g[i][j] == 1) && (col[i] != col[j])) res++;

Per non considerare la stessa coppia due volte (come e ), il valore finale di res dovrebbe essere diviso per due.

res /= 2;

Stampiamo la risposta.

printf("%d\n", res);