Vous êtes sur la page 1sur 25

Estrutura de dados para

grafos
Alex Martins
Contedo

Introduo
Matriz de adjacncias
Listas de adjacncia
Tipo-de-dados abstrato
Subgrafos
Introduo

Os vrtices de nossos grafos sero representados por nmeros


inteiros. O conjunto de vrtices ser 0 1 2 3 ... V-1 .
Poderamos usar o tipo-de-dados int para representar vrtices,
mas melhor ter um nome especfico para esse tipo:

#define vertex int


Introduo

O conjunto de arcos de um grafo pode ser representado de vrias


maneiras. Discutimos abaixo duas representaes clssicas:
matriz de adjacncias e
listas de adjacncia.
Cada uma das representaes tem suas vantagens e suas
desvantagens. As descries a seguir devem ser entendidas
apenas como modelos e no como algo definitivo. As estruturas de
dados sero modificadas e adaptadas mais adiante, conforme as
necessidades.
Matriz de Adjacncia

A matriz de adjacncias de um grafo uma matriz booleana com


colunas e linhas indexadas pelos vrtices. Se adj[][] uma tal
matriz ento, para cada vrtice v e cada vrtice w,

adj[v][w] = 1 se v-w um arco e


adj[v][w] = 0 em caso contrrio
Matriz de Adjacncia

Assim, a linha v da matriz adj[][] representa o leque de sada do


vrtice v e a coluna w da matriz representa o leque de entrada do
vrtice w. Por exemplo, veja a matriz de adjacncias do grafo
cujos arcos so 0-1 0-5 1-0 1-5 2-4 3-1 5-3 :

0 1 2 3 4 5
0 0 1 0 0 0 1
1 1 0 0 0 0 1
2 0 0 0 0 1 0
3 0 1 0 0 0 0
4 0 0 0 0 0 0
5 0 0 0 1 0 0
Matriz de Adjacncia

Como nossos grafos no tm laos, os elementos da diagonal da


matriz de adjacncias so sempre iguais a 0. Se o grafo for no-
dirigido, a matriz simtrica: adj[v][w] adj[w][v].
Matriz de adjacncias

Um grafo pode ser representado por uma struct graph que contm
a matriz de adjacncias, o nmero de vrtices, e o nmero de
arcos do grafo:

01 struct graph {
02 int V;
03 int A;
04 int **adj;
05 };

06 typedef struct graph *Graph;


Matriz de adjacncias

A funo GRAPHinit() constri um grafo com vrtices 0 1 .. V-1 e


nenhum arco.

01 Graph GRAPHinit (int V) {


02 Graph G = malloc (sizeof *G);
03 G->V = V;
04 G->A = 0;
05 G->adj = MATRIXint (V, V, 0);
06 return G;
07 }
Matriz de adjacncias

A funo MATRIXint() aloca uma matriz com linhas 0..r-1 e colunas


0..c-1. Cada elemento da matriz recebe valor val.
01 static int **MATRIXint (int r, int c, int val) {
02 vertex i, j;
03 int **m = malloc( r * sizeof (int *));
04 for (i = 0; i < r; ++i)
05 m[i] = malloc( c * sizeof (int));
06 for (i = 0; i < r; ++i)
07 for (j = 0; j < c; ++j)
08 m[i][j] = val;
09 return m;
10 }
Matriz de adjacncias

A funo GRAPHinsertArc() insere um arco v-w no grafo G. A


funo supe que v e w so distintos, positivos e menores que G-
>V. Se o grafo j tem um arco v-w, a funo no faz nada.

01 void GRAPHinsertArc (Graph G, vertex v, vertex w) {


02 if (G->adj[v][w] == 0) {
03 G->adj[v][w] = 1;
04 G->A++;
}
}
Matriz de adjacncias

A funo GRAPHremoveArc() remove do grafo G o arco v-w. A


funo supe que v e w so distintos, positivos e menores que G-
>V. Se no existe arco v-w, a funo no faz nada.

01 void GRAPHremoveArc (Graph G, vertex v, vertex w) {


02 if (G->adj[v][w] == 1) {
03 G->adj[v][w] = 0;
04 G->A--;
}
}
Matriz de adjacncias

A funo GRAPHshow() imprime, para cada vrtice v do grafo G,


em uma linha, todos os vrtices adjacentes a v.
01 void GRAPHshow (Graph G) {
02 vertex v, w;
03 for (v = 0; v < G->V; ++v) {
04 printf ("%2d:", v);
05 for (w = 0; w < G->V; ++w)
06 if (G->adj[v][w] == 1)
07 printf (" %2d", w);
08 printf ("\n");
}
}
Lista de adjacncia

O vetor de listas de adjacncia de um grafo tem uma lista


encadeada (= linked list) associada com cada vrtice do grafo. A
lista associada com um vrtice v contm todos os vizinhos de v.
Portanto, a lista do vrtice v representa o leque de sada de v.
Por exemplo, eis o vetor de listas de adjacncia do grafo cujos
arcos so 0-1 0-5 1-0 1-5 2-4 3-1 5-3 :
0: 5 1
1: 5 0
2: 4
3: 1
4:
5: 3
Lista de adjacncia

Na representao por listas de adjacncia, um grafo


representado por uma struct graph que contm o vetor de listas
de adjacncia, o nmero de vrtices, e o nmero de arcos do
grafo:

01 struct graph {
02 int V;
03 int A;
04 link *adj;
};

05 typedef struct graph *Graph;


Lista de adjacncia

A lista de adjacncia de um vrtice v composta por ns do tipo


node. Cada n da lista corresponde a um arco e contm um
vizinho w de v e o endereo do n seguinte da lista. Um link um
ponteiro para um node.

01 typedef struct node *link;


02 struct node {
03 vertex w;
04 link next;
};
Lista de adjacncia

A funo NEWnode() recebe um vrtice w e o endereo next de


um n e devolve o endereo a de um novo n tal que a->w == w e
a->next == next.

01 static link NEWnode( vertex w, link next) {


02 link a = malloc( sizeof (struct node));
03 a->w = w;
04 a->next = next;
05 return a;
}
Lista de adjacncia
Lista de adjacncia

A funo GRAPHinit() constri um grafo com vrtices 0 1 .. V-1 e


nenhum arco.

01 Graph GRAPHinit (int V) {


02 vertex v;
03 Graph G = malloc (sizeof *G);
04 G->V = V;
05 G->A = 0;
06 G->adj = malloc (V * sizeof (link));
07 for (v = 0; v < V; ++v)
08 G->adj[v] = NULL;
09 return G;
}
Lista de adjacncia

A funo GRAPHinsertArc() insere um arco v-w no grafo G. A


funo supe que v e w so distintos, positivos e menores que G-
>V. Se o grafo j tem um arco v-w, a funo no faz nada.

01 void GRAPHinsertArc( Graph G, vertex v, vertex w) {


02 link a;
03 for (a = G->adj[v]; a != NULL; a = a->next)
04 if (a->w == w) return;
05 G->adj[v] = NEWnode( w, G->adj[v]);
06 G->A++;
}
Lista de adjacncia

O espao ocupado pelo vetor de listas de adjacncia


proporcional ao nmero de vrtices e arcos do grafo, ou seja,
proporcional ao tamanho do grafo. Portanto, listas de adjacncia
so uma maneira econmica de representao. Para grafos
esparsos, listas de adjacncia ocupam menos espao que uma
matriz de adjacncias.
Tipo abstrato de dados

Mostramos acima duas maneiras de representar um grafo. O modo como


fizemos isso aponta para a possibilidade de tratar o conceito de grafo
comotipo-de-dados abstrato (= ADT = abstract data type). Um tipo-de-
dados abstrato para grafos permitiria isolar os programa que usam grafos
dos detalhes da implementao do conceito: um usurio poderia
escrever sua aplicao sem saber como os grafos so implementados.
Entretanto, as implementaes descritas nesta pgina no chegam a
definir um tipo-de-dados abstrato, pois o usurio no pode ignorar
completamente os detalhes da representao utilizada. Assim, a ideia de
tratar grafos como um tipo-de-dados abstrato no ser levada a srio
neste stio.
SubGrafos

Infelizmente, nossas estruturas de dados entram em choque com a


definio de subgrafo, pois supem que todo grafo tem vrtices 0
1 2 ... V-1. Assim, vamos precisar de jogo de cintura ao usar o
termo subgrafo.

Suponha, por exemplo, que G um grafo com vrtices 0 1 2 ... 99.


Se dissermos que H um subgrafo de G e tem 5 vrtices, ficar
subentendido que a representao de H est embutida na
representao de G e que os vrtices de H no so
necessariamente 0 1 2 3 4, podendo ser 11 22 33 55 88, por
exemplo.
SubGrafos

Na representao por listas de adjacncia, um grafo


representado por uma struct graph que contm o vetor de listas
de adjacncia, o nmero de vrtices, e o nmero de arcos do
grafo:

0: 5 1
1: 5 0
2: 4
3: 1
4:
5: 3
Referncias

Vous aimerez peut-être aussi