Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... ·...

70
Roberto Trani [email protected] Lezione 12 Grafi Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start

Transcript of Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... ·...

Page 1: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Roberto [email protected]

Lezione 12Grafi

Pagina web del corsohttp://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start

Page 2: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Page 3: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Page 4: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 puo 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

Page 5: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Esercizio 5typedef struct _Nodo { int key; struct _Nodo* left; struct _Nodo* central; struct _Nodo* right; } Nodo;

Page 6: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 …

Page 7: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Page 8: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Page 9: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Grafi

0

1 2

3

4

5

Page 10: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Matrice di adiacenza0

1 2

3

4

5

Page 11: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Anna Bernasconi
Page 12: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Page 13: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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…

Page 14: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza0

1 2

3

4

5

Page 15: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

0

1 2

3

4

5

Page 16: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

5 /

0

1 2

3

4

5

Page 17: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

0 3 4 /

5 /

0

1 2

3

4

5

Page 18: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

0 3 4 /

5 /

/

0

1 2

3

4

5

Page 19: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

/

0

1 2

3

4

5

Page 20: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

2 /

/

0

1 2

3

4

5

Page 21: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza

E

0 3 4 /

4 5 /

5 /

2 /

0 /

/

0

1 2

3

4

5

Page 22: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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

Page 23: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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…

Page 24: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Liste di adiacenza compatte0

1 2

3

4

5

Page 25: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

E

Liste di adiacenza compatte

51

0 3 43

4 52

21

/0

1 0

0

1 2

3

4

5

Page 26: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

E

Liste di adiacenza compatte

typedef struct _edges {int num_edges;int * edges;

} edges;

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

51

0 3 43

4 52

21

/0

1 0

0

1 2

3

4

5

Page 27: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

E

Liste di adiacenza compatte

typedef struct _edges {int num_edges;int * edges;

} edges;

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

51

0 3 43

4 52

21

/0

1 0

0

1 2

3

4

5

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

— algoritmo dimezza e raddoppia… —

Page 28: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Lettura grafo da input

Page 29: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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

Page 30: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

Page 31: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

Page 32: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

Page 33: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

Page 34: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

Page 35: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

5

Page 36: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

5

Page 37: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

5

Page 38: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

Page 39: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

Page 40: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

Page 41: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

Page 42: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

Page 43: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

Page 44: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

Page 45: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

Page 46: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

2

Page 47: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

2

Page 48: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

2

Page 49: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 0

0 3 4

5

4 5

2

0

Page 50: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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:61 53 0 3 402 4 51 21 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;

}

Page 51: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in profondità0

1 2

3

4

5 3

Page 52: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in profondità0

1 2

3

4

5 3

4

Page 53: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in profondità0

1 2

3

4

5 3

4

2

Page 54: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in profondità0

1 2

3

4

5 3

4

2

5

Page 55: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in profondità0

1 2

3

4

5 3

4

2

5

0

Page 56: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 colorifor (int i=0; i < n; ++i) colors[i] = 0;colors[from] = 1;// chiamata ricorsivarecursive_dfs(E, from, colors);return colors;

}

Page 57: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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 colorifor (int i=0; i < n; ++i) colors[i] = 0;colors[from] = 1;// chiamata ricorsivarecursive_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 colorifor (i=0; i < n; ++i) colors[i] = 0;colors[from] = 1;// inizializzo lo stackstack[0] = from; stack_size = 1;// loop fino a terminazione dello stackwhile (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;

}

Page 58: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

1 2

3

4

5 3

Page 59: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

1 2

3

4

5 3

4

Page 60: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

1 2

3

4

5 3

4

5

Page 61: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

1 2

3

4

5 3

4

2

5

Page 62: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

1 2

3

4

5 3

4

2

5

0

Page 63: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

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

Page 64: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

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 colorifor (i=0; i < n; ++i) colors[i] = 0;colors[from] = 1;// inizializzo la codaqueue_init(&q, n);queue_pushBack(&q, from);// loop fino a terminazione della codawhile (!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;

}

Page 65: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Visita in ampiezza0

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 colorifor (i=0; i < n; ++i) colors[i] = 0;colors[from] = 1;// inizializzo la codaqueue_init(&q, n);queue_pushBack(&q, from);// loop fino a terminazione della codawhile (!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…

Page 66: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Esercizio 1Grafo bipartito

Grafo bipartito

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1se il grafo e bipartito, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun 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 puopartizionare in due sottoinsiemi in cui ogni vertice e collegato solo a verticiappartenenti 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 verticeun 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

Page 67: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Esercizio 2Grafo connesso

Grafo connesso

Esercizio

Scrivere un programma che legga da tastiera un grafo indiretto e stampi 1se il grafo e connesso, 0 altrimenti. Il grafo e rappresentato nel seguenteformato: la prima riga contiene il numero n di nodi, le successive n righecontengono, per ciascun nodo i, con 0 i < n, il numero ni di archi uscentida 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 perciascun arco da i a j esiste anche l’arco da j ad i.

Un grafo e connesso quando esiste un percorso tra due vertici qualunquedel grafo. Il programma deve eseguire una visita DFS (a partire da un nodoqualunque, perche?) 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 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 connesso, -0 altrimenti.

1

Page 68: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Esercizio 3Percorso minimo

Percorso minimo

Esercizio

Scrivere un programma che legga da tastiera un grafo diretto, una sequenzadi m query composte da due indici ciascuna e stampi, per ciascuna query,la lunghezza del percorso minimo che collega i rispettivi due nodi dellaquery. Il grafo e rappresentato nel seguente formato: la prima riga contieneil 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).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 delgrafo a partire dal nodo i per stabilire il percorso minimo che porta al nodoj, 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 ni di archi uscenti da i;

– lista di ni 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 partenzae l’indice del nodo di destinazione.

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

1

Page 69: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

Esercizio 4Diametro grafo

Diametro grafo

Esercizio

Scrivere un programma che legga da tastiera un grafo diretto e stampi ildiametro del grafo. Il grafo e rappresentato nel seguente formato: la primariga contiene il numero n di nodi, le successive n righe contengono, perciascun nodo i, con 0 i < n, il numero ni di archi uscenti da i seguito dauna lista di ni nodi destinazione, rappresentati con i numeri [0, n).

Il diametro di un grafo e la lunghezza del “piu lungo cammino minimo”fra tutte le coppie di nodi. Il programma deve eseguire una visita BFS apartire da ciascun nodo i del grafo per stabilire il cammino minimo piu lungoa 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 ni di archi uscenti da i;

– lista di ni 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

Page 70: Lezione 12 Grafi - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/informatica/all-b/... · 2019-05-12 · Esercizio 2 ABR: Visita Albero binario di ricerca: Visita Esercizio Scrivere

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, inentrambi i versi, ma non possono passare una sopra l’altra. Le formiche unavolta decisa una direzione non la cambiano piu fino a che non si scontranocon un’altra formica che andava in direzione opposta. Le formiche si muo-vono tutte insieme a step regolari, di un segmento alla volta nelle rispettivedirezioni. Quando due formiche si scontrano cambiano direzione e tornanoal segmento che occupavano (ma questa volta andando in direzione oppo-sta). Quando una formica fa un passo oltre il primo o l’ultimo dei segmenticade dalla corda.

Inizialmente ogni formica occupa un segmento distinto della corda, macon una direzione iniziale a noi sconosciuta. Individuare il numero di stepnecessari a�nche al caso pessimo tutte le formiche cadano dalla corda.

1