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