• Non ci sono risultati.

Lezione 12 Grafi

N/A
N/A
Protected

Academic year: 2021

Condividi "Lezione 12 Grafi"

Copied!
70
0
0

Testo completo

(1)

Roberto Trani

roberto.trani@di.unipi.it

Lezione 12 Grafi

Pagina web del corso

http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start

(2)

Esercizio 2

ABR: Visita

Albero binario di ricerca: Visita

Esercizio

Scrivere un programma che legga da tastiera una sequenza di N interi di- stinti e li inserisca in un albero binario di ricerca (senza ribilanciamento).

Il programma deve visitare opportunamente l’albero e restituire la sua al- tezza.

Nella prima riga dell’input si trova la lunghezza N della sequenza; nelle successive N righe si trovano gli interi che compongono la sequenza.

L’output contiene unicamente l’altezza dell’albero.

Esempio

Input

4 (lunghezza della sequenza) 2

0 3 1

Output 3

1

(3)

Esercizio 2

typedef struct _node { struct _node *left;

struct _node *right;

int value;

} node;

int maxdepth(node *n) { if (n == NULL) return 0;

return 1 + max( maxdepth(n->left), maxdepth(n->right) );

}

(4)

Esercizio 5

Albero Ternario (prova del 01/02/2012)

Algoritmica - Prova di Laboratorio del 01/02/2012

Esercizio: Albero ternario

Scrivere un programma che riceva in input una sequenza di N interi posi- tivi e costruisca un albero ternario di ricerca non bilanciato. L’ordine di inserimento dei valori nell’albero deve coincidere con quello della sequenza.

Ogni nodo in un albero ternario di ricerca pu` o avere fino a tre figli:

figlio sinistro, figlio centrale e figlio destro. L’inserimento di un nuovo valore avviene partendo dalla radice dell’albero e utilizzando la seguente regola. Il valore da inserire viene confrontato con la chiave del nodo corrente. Ci sono tre possibili casi in base al risultato del confronto:

1. se il valore `e minore della chiave del nodo corrente, esso viene inserito ricorsivamente nel sottoalbero radicato nel figlio sinistro;

2. se il valore `e divisibile per la chiave del nodo corrente, esso viene inserito ricorsivamente nel sottoalbero radicato nel figlio centrale;

3. in ogni altro caso il valore viene inserito ricorsivamente nel sottoalbero radicato nel figlio destro.

Il programma deve stampare il numero di nodi dell’albero che hanno tre figli.

La prima riga contiene la lunghezza N della sequenza. Le N righe successive contengono ciascuna un elemento da inserire nell’albero.

L’output `e costituito da una singola riga che contiene il numero di nodi dell’albero che hanno tre figli.

1

(5)

Esercizio 5

typedef struct _Nodo { int key;

struct _Nodo* left;

struct _Nodo* central;

struct _Nodo* right;

} Nodo;

(6)

Esercizio 5

void insert(Nodo **t, int k) { Nodo *e, *p, *x;

/* crea il nodo foglia da inserire contenente la chiave */

e = (Nodo *) malloc(sizeof(Nodo));

if (e == NULL) exit(-1);

e->key = k;

e->left = e->right = e->central = NULL;

x = *t;

/* se l'albero è vuoto imposta e come radice dell'albero */

if (x == NULL) { *t = e;

return;

}

continua …

(7)

Esercizio 5

/* altrimenti cerca la posizione della foglia nell'albero */

while (x != NULL) { p = x;

if(k % x->key == 0) x = x->central;

else {

if (k < x->key) x = x->left;

else x = x->right;

} }

/* ora p punta al padre del nuovo elemento da inserire in t quindi si procede a collegare p ed e */

if(k % p->key == 0) p->central = e;

else {

if (k < p->key) p->left = e;

else p->right = e;

}

(8)

Esercizio 5

int conta(Nodo * node) { int r, c, l, curr;

if (node == NULL) return 0;

r = c = l = curr = 0;

if (node->right != NULL) { r = conta(node->right); curr++;}

if (node->left != NULL) { l = conta(node->left); curr++;}

if (node->central != NULL) { c = conta(node->central); curr++;}

if (curr == 3) return r+l+c+1;

else return r+l+c;

}

(9)

Grafi

0

1 2

3 4

5

(10)

Matrice di adiacenza

0

1 2

3

4

5

(11)

Matrice di adiacenza

M

0 1 0

0 0 0

0 0 0 0

0 1

0 0 0

0 1 0

0 1 0

0 1 0

1

0 0 0

0 0

1

0 0

1

0 0

0

1 2

3

4

5

(12)

Matrice di adiacenza

M

0 1 0

0 0 0

0 0 0 0

0 1

0 0 0

0 1 0

0 1 0

0 1 0

1

0 0 0

0 0

1

0 0

1

0 0

0

1 2

3

4 5

int ** M = (int **) malloc(N*sizeof(int *));

for (int i=0; i<N; ++i) {

M[i] = (int *) malloc(N*sizeof(int));

}

(13)

Matrice di adiacenza

M

0 1 0

0 0 0

0 0 0 0

0 1

0 0 0

0 1 0

0 1 0

0 1 0

1

0 0 0

0 0

1

0 0

1

0 0

0

1 2

3

4 5

int ** M = (int **) malloc(N*sizeof(int *));

for (int i=0; i<N; ++i) {

M[i] = (int *) malloc(N*sizeof(int));

}

Troppi zeri…

(14)

Liste di adiacenza

0

1 2

3

4

5

(15)

Liste di adiacenza

E

0

1 2

3

4

5

(16)

Liste di adiacenza

E

5 /

0

1 2

3

4

5

(17)

Liste di adiacenza

E

0 3 4 /

5 /

0

1 2

3

4

5

(18)

Liste di adiacenza

E

0 3 4 /

5 /

/

0

1 2

3

4

5

(19)

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

/

0

1 2

3

4

5

(20)

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

2 /

/

0

1 2

3

4

5

(21)

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

2 /

0 /

/

0

1 2

3

4

5

(22)

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

2 /

typedef struct _edge { struct _edge * next;

int nodeid;

} edge;

edge ** E = (edge **) malloc(N*sizeof(edge *));

0 /

/

0

1 2

3

4

5

(23)

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

2 /

typedef struct _edge { struct _edge * next;

int nodeid;

} edge;

edge ** E = (edge **) malloc(N*sizeof(edge *));

0 /

/

0

1 2

3

4 5

Troppi salti in memoria…

(24)

Liste di adiacenza compatte

0

1 2

3

4

5

(25)

E

Liste di adiacenza compatte

5 1

0 3 4

3

4 5

2

2 1

0 /

1 0

0

1 2

3

4

5

(26)

E

Liste di adiacenza compatte

typedef struct _edges { int num_edges;

int * edges;

} edges;

edges *E = (edges *) malloc(N*sizeof(edges));

5 1

0 3 4

3

4 5

2

2 1

0 /

1 0

0

1 2

3

4

5

(27)

E

Liste di adiacenza compatte

typedef struct _edges { int num_edges;

int * edges;

} edges;

edges *E = (edges *) malloc(N*sizeof(edges));

5 1

0 3 4

3

4 5

2

2 1

0 /

1 0

0

1 2

3

4 5

I grafi dinamici possono essere realizzati usando vettori dinamici, o ridimensionabili


— algoritmo dimezza e raddoppia… —

(28)

Lettura grafo da input

(29)

Lettura grafo da input

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

(30)

Lettura grafo da input

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5

1 2

1 0

(31)

Lettura grafo da input

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5

1 2

1 0

(32)

E

Lettura grafo da input

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5

1 2

1 0

(33)

E

Lettura grafo da input

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5

1 2

1 0

(34)

E

Lettura grafo da input

1

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5

1 2

1 0

(35)

E

Lettura grafo da input

1

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

5

(36)

E

Lettura grafo da input

1

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

5

(37)

E

Lettura grafo da input

1 3

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

5

(38)

E

Lettura grafo da input

1 3

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

(39)

E

Lettura grafo da input

1 3

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

(40)

E

Lettura grafo da input

1 3 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

(41)

E

Lettura grafo da input

1 3 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

(42)

E

Lettura grafo da input

1 3

2 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

(43)

E

Lettura grafo da input

1 3

2 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

(44)

E

Lettura grafo da input

1 3

2 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

(45)

E

Lettura grafo da input

1 3

2 1 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

(46)

E

Lettura grafo da input

1 3

2 1 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

2

(47)

E

Lettura grafo da input

1 3

2 1 0 /

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

2

(48)

E

Lettura grafo da input

1 3

2 1 0 /

1

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

2

(49)

E

Lettura grafo da input

1 3

2 1 0 /

1

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

2

0

(50)

E

Lettura grafo da input

1 3

2 1 0 /

1

Negli esercizi sarà richiesto di leggere un file avente il seguente formato:

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero ni di archi uscenti da i seguito da una lista di ni nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero ni di archi uscenti da i;

– lista di ni nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

Esempio:

6 1 5

3 0 3 4 0

2 4 5 1 2 1 0

0 3 4

5

4 5

2 0

edges * read_graph() { edges * E;

int n, ne, i, j;

scanf(“%d”, &n);

E = (edges *) malloc(sizeof(edges) * n);

for (i=0; i < n; ++i) { scanf(“%d”, &(ne));

E[i].num_edges = ne;

E[i].edges = (int *) malloc(sizeof(int) * ne);

for (j=0; j < ne; ++j) {

scanf(“%d”, E[i].edges + j);

} }

return E;

}

(51)

Visita in profondità

0

1 2

3

4

5 3

(52)

Visita in profondità

0

1 2

3

4

5 3

4

(53)

Visita in profondità

0

1 2

3

4

5 3

4

2

(54)

Visita in profondità

0

1 2

3

4

5 3

4

2

5

(55)

Visita in profondità

0

1 2

3

4

5 3

4

2

5

0

(56)

Visita in profondità

0

1 2

3

4

5 3

4

2

5

0

void recursive_dfs(

edges *E, int src, int *colors ) {

int dest;

for (int i=0; i < E[src].num_edges; ++i) { dest = E[src].edges[i];

if (!colors[dest]) { colors[dest] = 1;

recursive_dfs(dest, E, colors);

} }

}

int * dfs(edges *E, int n, int from) {

int * colors = (int *) malloc(sizeof(int)*n);

// inizializzo i colori

for (int i=0; i < n; ++i) colors[i] = 0;

colors[from] = 1;

// chiamata ricorsiva

recursive_dfs(E, from, colors);

return colors;

}

(57)

Visita in profondità

0

1 2

3

4

5 3

4

2

5

0

void recursive_dfs(

edges *E, int src, int *colors ) {

int dest;

for (int i=0; i < E[src].num_edges; ++i) { dest = E[src].edges[i];

if (!colors[dest]) { colors[dest] = 1;

recursive_dfs(dest, E, colors);

} }

}

int * dfs(edges *E, int n, int from) {

int * colors = (int *) malloc(sizeof(int)*n);

// inizializzo i colori

for (int i=0; i < n; ++i) colors[i] = 0;

colors[from] = 1;

// chiamata ricorsiva

recursive_dfs(E, from, colors);

return colors;

} int * dfs(edges *E, int n, int from) {

int * colors = (int *) malloc(sizeof(int) * n);

int * stack = (int *) malloc(sizeof(int) * n);

int stack_size, src, dest, i;

// inizializzo i colori

for (i=0; i < n; ++i) colors[i] = 0;

colors[from] = 1;

// inizializzo lo stack

stack[0] = from; stack_size = 1;

// loop fino a terminazione dello stack while (stack_size) {

src = stack[--stack_size];

for (i=0; i < E[src].num_edges; ++i) { dest = E[src].edges[i];

if (!colors[dest]) { colors[dest] = 1;

stack[stack_size++] = dest;

} }

}

// libero la memoria free(stack);

return colors;

}

(58)

Visita in ampiezza

0

1 2

3

4

5 3

(59)

Visita in ampiezza

0

1 2

3

4

5 3

4

(60)

Visita in ampiezza

0

1 2

3

4

5 3

4

5

(61)

Visita in ampiezza

0

1 2

3

4

5 3

4

2

5

(62)

Visita in ampiezza

0

1 2

3

4

5 3

4

2

5

0

(63)

Visita in ampiezza

0

1 2

3

4

5 3

4

2

5

0

typedef struct _queue { int * values;

int capacity;

int head;

int tail;

} queue;

void queue_init(queue * q, int capacity);

void queue_deinit(queue * q);

void queue_pushBack(queue * q, int value);

int queue_popFront(queue * q);

int queue_isEmpty(queue * q);

(64)

Visita in ampiezza

0

1 2

3

4

5 3

4

2

5

0

typedef struct _queue { int * values;

int capacity;

int head;

int tail;

} queue;

void queue_init(queue * q, int capacity);

void queue_deinit(queue * q);

void queue_pushBack(queue * q, int value);

int queue_popFront(queue * q);

int queue_isEmpty(queue * q);

int * bfs(edges *E, int n, int from) {

int * colors = (int *) malloc(sizeof(int) * n);

queue q;

int src, dest, i;

// inizializzo i colori

for (i=0; i < n; ++i) colors[i] = 0;

colors[from] = 1;

// inizializzo la coda queue_init(&q, n);

queue_pushBack(&q, from);

// loop fino a terminazione della coda while (!queue_isEmpty(&q)) {

src = queue_popFront(&q);

for (i=0; i < E[src].num_edges; ++i) { dest = E[src].edges[i];

if (!colors[dest]) { colors[dest] = 1;

queue_pushBack(&q, dest);

} }

}

// libero la memoria queue_deinit(&q);

return colors;

}

(65)

Visita in ampiezza

0

1 2

3

4

5 3

4

2

5

0

typedef struct _queue { int * values;

int capacity;

int head;

int tail;

} queue;

void queue_init(queue * q, int capacity);

void queue_deinit(queue * q);

void queue_pushBack(queue * q, int value);

int queue_popFront(queue * q);

int queue_isEmpty(queue * q);

int * bfs(edges *E, int n, int from) {

int * colors = (int *) malloc(sizeof(int) * n);

queue q;

int src, dest, i;

// inizializzo i colori

for (i=0; i < n; ++i) colors[i] = 0;

colors[from] = 1;

// inizializzo la coda queue_init(&q, n);

queue_pushBack(&q, from);

// loop fino a terminazione della coda while (!queue_isEmpty(&q)) {

src = queue_popFront(&q);

for (i=0; i < E[src].num_edges; ++i) { dest = E[src].edges[i];

if (!colors[dest]) { colors[dest] = 1;

queue_pushBack(&q, dest);

} }

}

// libero la memoria queue_deinit(&q);

return colors;

}

Da implementare…

(66)

Esercizio 1

Grafo bipartito

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e bipartito, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero n i di archi uscenti da i seguito da una lista di n i nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esista anche l’arco da j ad i.

Un grafo bipartito `e un grafo tale che l’insieme dei suoi vertici si pu`o partizionare in due sottoinsiemi in cui ogni vertice `e collegato solo a vertici appartenenti alla partizione opposta.

Suggerimento: un grafo `e bipartito se e solo se `e possibile colorarlo usan- do due colori. Colorare il grafo corrisponde ad assegnare a ciascun vertice un colore diverso da quello dei suoi vertici adiacenti.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero n i di archi uscenti da i;

– lista di n i nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e bipartito, 0 altrimenti.

Esempio

Input

5 (numero di elementi)

2 1 3 3 0 2 4 2 1 3 3 0 2 4 2 1 3

Output 1

1

(67)

Esercizio 2

Grafo connesso

Grafo connesso

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1 se il grafo `e connesso, 0 altrimenti. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero n i di archi uscenti da i seguito da una lista di n i nodi destinazione, rappresentati con i numeri [0, n). Si assuma che l’input contenga un grafo indiretto, e quindi che per ciascun arco da i a j esiste anche l’arco da j ad i.

Un grafo `e connesso quando esiste un percorso tra due vertici qualunque del grafo. Il programma deve eseguire una visita DFS (a partire da un nodo qualunque, perch´e?) del grafo per stabilire se questo `e connesso.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero n i di archi uscenti da i;

– lista di n i nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una riga contenente 1 se il grafo `e connesso, -0 altrimenti.

1

(68)

Esercizio 3

Percorso minimo

Percorso minimo

Esercizio

Scrivere un programma che legga da tastiera un grafo diretto, una sequenza di m query composte da due indici ciascuna e stampi, per ciascuna query, la lunghezza del percorso minimo che collega i rispettivi due nodi della query. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero n i di archi uscenti da i seguito da una lista di n i nodi destinazione, rappresentati con i numeri [0, n).

Il percorso minimo dal nodo i al nodo j `e il percorso che porta da i a j avente il minor numero di nodi. A tale scopo si esegua una visita BFS del grafo a partire dal nodo i per stabilire il percorso minimo che porta al nodo j, qualora questo esista.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero n i di archi uscenti da i;

– lista di n i nodi destinazione, rappresentati con i numeri [0, n).

• una riga contenente il numero m di query;

• m righe, una per ciasuna query, contenenti l’indice del nodo di partenza e l’indice del nodo di destinazione.

L’output contiene m righe contenenti ciascuna la lunghezza del percorso minimo che collega i due nodi della rispettiva query e -1 quando i nodi non sono collegati.

1

(69)

Esercizio 4

Diametro grafo

Diametro grafo

Esercizio

Scrivere un programma che legga da tastiera un grafo diretto e stampi il diametro del grafo. Il grafo `e rappresentato nel seguente formato: la prima riga contiene il numero n di nodi, le successive n righe contengono, per ciascun nodo i, con 0  i < n, il numero n i di archi uscenti da i seguito da una lista di n i nodi destinazione, rappresentati con i numeri [0, n).

Il diametro di un grafo `e la lunghezza del “pi` u lungo cammino minimo”

fra tutte le coppie di nodi. Il programma deve eseguire una visita BFS a partire da ciascun nodo i del grafo per stabilire il cammino minimo pi` u lungo a partire da i, e quindi stampare il massimo tra tutti questi.

L’input `e costituito da:

• una riga contenente il numero n di nodi del grafo;

• n righe, una per ciasun nodo i, con i 2 [0, n), nel seguente formato:

– numero n i di archi uscenti da i;

– lista di n i nodi destinazione, rappresentati con i numeri [0, n).

L’output contiene una sola riga contenente il diametro del grafo.

Esempio

Input

6 (numero di elementi)

2 1 3 2 0 2 2 1 5 2 0 4 1 2 1 2

Output 1

1

(70)

Puzzle

Puzzle

Formiche in riga

Una colonia di n formiche `e disposta in linea retta su una corda lunga esat- tamente n segmenti. Le formiche possono muoversi solo in orizzontale, in entrambi i versi, ma non possono passare una sopra l’altra. Le formiche una volta decisa una direzione non la cambiano pi` u fino a che non si scontrano con un’altra formica che andava in direzione opposta. Le formiche si muo- vono tutte insieme a step regolari, di un segmento alla volta nelle rispettive direzioni. Quando due formiche si scontrano cambiano direzione e tornano al segmento che occupavano (ma questa volta andando in direzione oppo- sta). Quando una formica fa un passo oltre il primo o l’ultimo dei segmenti cade dalla corda.

Inizialmente ogni formica occupa un segmento distinto della corda, ma con una direzione iniziale a noi sconosciuta. Individuare il numero di step necessari affinch´e al caso pessimo tutte le formiche cadano dalla corda.

1

Riferimenti

Documenti correlati

liste di adiacenza: una lista di tutti i nodi e, per ciascuno di essi, una lista dei nodi

Per semplicità, si considera quindi una funzione peso che assume solo valori

Soluzione : dalle matrici di adiacenza si vede che il vertice corrispondente alla settima colonna (o riga) in G’ ha grado 4, mentre G non ha vertici di grado 4. Ciò implica che G e

 Se un thread, che possiede alcune risorse, richiede un’altra risorsa, che non gli può essere allocata immediatamente, allora rilascia tutte le risorse possedute.  Le

Si assuma che l’input contenga un grafo indiretto, e quindi che per 11 ciascun arco da i a j esiste anche l’arco da j ad i.. 12 Un grafo è connesso quando esiste un percorso tra

In un grafo bipartito ogni decomposizione in cricche consiste di coppie di nodi adiacenti, cio`e di un accoppiamento, e di nodi singoli.. Sia θ(G) = |M| + |S| dove M `e

• La visita in ampiezza fa uso di una coda per memorizzare tutti i nodi adiacenti al nodo v visitato, che portano ad un nodo non marcato come scoperto. • I nodi raggiungibili

Come applicazione della matrice d’adiacenza, ricaviamo alcune formule per il calcolo del numero di cammini e cicli di lunghezza fissata. 1 Numero di cammini in