Você está na página 1de 26

Funes bsicas

S 17.3

MATRIXint
Aloca uma matriz com linhas 0..r-1 e colunas 0..c-1, cada elemento da matriz recebe valor val int **MATRIXint (int r,

int c, int val) {

MATRIXint
Aloca uma matriz com linhas 0..r-1 e colunas 0..c-1, cada elemento da matriz recebe valor val 0 1 2 3 4 5 6 7 int **MATRIXint (int r, int c, int val) { Vertex i, j; int **m = malloc(r * sizeof(int *)); for (i = 0; i < r; i++) m[i] = malloc(c * sizeof(int)); for (i = 0; i < r; i++) for (j = 0; j < c; j++) m[i][j] = val; return m; }

Consumo de tempo
linha nmero de execues da linha 1 2 3 4 5 6

=1 =r+1 =r =r+1 = r (c + 1) =rc

= (1) = (r) = (r) = (r) = (r c) = (r c)

total (1) + 3 (r) + 2 (r c) = (r c)

Concluso

Supondo que o consumo de tempo da funo malloc constante O consumo de tempo da funo MATRIXint (r c).

DIGRAPHinit
Devolve (o endereo de) um novo digrafo com vrtices 0,..,V-1 e nenhum arco.

Digraph DIGRAPHinit (int V) {

DIGRAPHinit
Devolve (o endereo de) um novo digrafo com vrtices 0,..,V-1 e nenhum arco.

0 1 2 3 4

Digraph DIGRAPHinit (int V) { Digraph G = malloc(sizeof *G); G>V = V; G>A = 0; G>adj = MATRIXint(V, V, 0); return G;
}

DIGRAPHinsertA
Insere um arco v-w no digrafo G. Se v == w ou o digrafo j tem arco v-w, no faz nada

void

DIGRAPHinsertA (Digraph G, Vertex v, Vertex w)

DIGRAPHinsertA
Insere um arco v-w no digrafo G. Se v == w ou o digrafo j tem arco v-w, no faz nada

void
{

DIGRAPHinsertA (Digraph G, Vertex v, Vertex w)

if (v != w && G>adj[v][w] == 0) {
}

G>adj[v][w] = 1; G>A++;

DIGRAPHremoveA
Remove do digrafo G o arco v-w Se no existe tal arco, a funo nada faz.

void

DIGRAPHremoveA (Digraph G, Vertex v, Vertex w)

DIGRAPHremoveA
Remove do digrafo G o arco v-w Se no existe tal arco, a funo nada faz.

void
{

DIGRAPHremoveA (Digraph G, Vertex v, Vertex w)

if (G>adj[v][w] == 1) {
}

G>adj[v][w] = 0; G>A ;

DIGRAPHshow
Para cada vrtice v de G, imprime, em uma linha, os vrtices adjacentes a v

void DIGRAPHshow (Digraph G) {

DIGRAPHshow
Para cada vrtice v de G, imprime, em uma linha, os vrtices adjacentes a v

void DIGRAPHshow (Digraph G) {


1 2 3 4 5 6 }

Vertex v, w; for (v = 0; v < G>V; v++) { printf("%2d:", v); for (w = 0; w < G>V; w++) if (G>adj[v][w] == 1) printf("%2d", w); printf("\n");
}

DIGRAPHshow

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

2 3 4 1 4 4 5 1 5 1

Consumo de tempo
linha nmero de execues da linha 1 2 3 4 5 6

=V+1 =V = V (V + 1) =VV VV =V

= (V) = (V) = (V2 ) = (V2 ) = O(V2 ) = (V)

total 3 (V) + O(V2 ) + 3 (V2 ) = (V2 )

Concluso

O consumo de tempo da funo DigraphShow (V2 ).

Funes bsicas para grafos

Funes bsicas para grafos


#dene GRAPHinit DIGRAPHinit #dene GRAPHshow DIGRAPHshow Funo que insere uma aresta v-w no grafo G

void

GRAPHinsertE (Graph G, Vertex v, Vertex w)

Funes bsicas para grafos


#dene GRAPHinit DIGRAPHinit #dene GRAPHshow DIGRAPHshow Funo que insere uma aresta v-w no grafo G

void
{

GRAPHinsertE (Graph G, Vertex v, Vertex w) DIGRAPHinsertA(G, v, w); DIGRAPHinsertA(G, w, v);

Exerccio. Escrever a funo GRAPHremoveE

Caminhos em digrafos

S 17.1

Caminhos
Um caminho num digrafo qualquer seqncia da forma v0 v1 v2 ...vk1 vp , onde vk1 -vk um arco para k = 1, . . . , p. Exemplo: 2-4-1-3-5-4-5 um caminho com origem 2 trmino 5
1 3

0 2 4

Caminhos simples
Um caminho simples se no tem vrtices repetidos Exemplo: 2-4-1-3-5 um caminho simples de 2 a 5
1 3

0 2 4

Procurando um caminho
Problema: dados um digrafo G e dois vrtices s e t decidir se existe um caminho de s a t Exemplo: para s = 0 e t = 1 a resposta SIM
2 1

Procurando um caminho
Problema: dados um digrafo G e dois vrtices s e t decidir se existe um caminho de s a t Exemplo: para s = 0 e t = 1 a resposta SIM
2 1

Procurando um caminho
Problema: dados um digrafo G e dois vrtices s e t decidir se existe um caminho de s a t Exemplo: para s = 5 e t = 4 a resposta NO
2 1

DIGRAPHpath

Recebe um digrafo G e vrtices s e t e devolve 1 se existe um caminho de s a t ou devolve 0 em caso contrrio Supe que o digrafo tem no mximo maxV vrtices.

int DIGRAPHpath (Digraph G, Vertex s, Vertex t)

Você também pode gostar