Você está na página 1de 32

Trabalho Didático Respostas

Aleff Jonathan da Silva Soares de Souza

1)
Planejamento de rotas de transporte: um grafo pode ser utilizado para representar as rotas de
transporte de mercadorias, pessoas ou animais, com os vértices representando os locais de partida e
chegada, e as arestas representando as rotas possíveis entre esses locais.
Exemplo de grafo:
digraph {
A -> B [label="10km"]
B -> C [label="20km"]
C -> D [label="15km"]
A -> C [label="30km"]
B -> D [label="25km"]
}

Planejamento de redes de computadores: um grafo pode ser utilizado para representar a rede de
computadores de uma empresa, com os vértices representando os computadores e as arestas
representando as conexões de rede entre eles.
Exemplo de grafo:
digraph {
A -> B [label="Ethernet"]
B -> C [label="Wi-Fi"]
C -> D [label="Bluetooth"]
A -> C [label="Wi-Fi"]
B -> D [label="Ethernet"]
}

Análise de relacionamentos sociais: um grafo pode ser utilizado para representar as relações sociais
entre indivíduos, com os vértices representando as pessoas e as arestas representando os
relacionamentos (por exemplo, amizade, parentesco, trabalho em equipe).
Exemplo de grafo:
digraph {
A -> B [label="amigo"]
B -> C [label="colega"]
C -> D [label="parente"]
A -> C [label="colega"]
B -> D [label="amigo"]
}

Modelagem de banco de dados: um grafo pode ser utilizado para representar a estrutura de um
banco de dados, com os vértices representando as tabelas e as arestas representando as relações
entre elas (por exemplo, chaves estrangeiras).
Exemplo de grafo:
digraph {
Cliente -> Pedido [label="FK"]
Pedido -> Item [label="FK"]
Cliente -> Endereco [label="FK"]
Item -> Produto [label="FK"]
}
Estratégias de marketing: um grafo pode ser utilizado para representar as estratégias de marketing
de uma empresa, com os vértices representando as campanhas publicitárias e as arestas
representando as influências entre elas (por exemplo, uma campanha que aumenta as vendas de um
produto pode influenciar outra campanha relacionada a esse produto).
Exemplo de grafo:
digraph {
Facebook -> Instagram [label="influencia"]
Instagram -> Twitter [label="influencia"]
Twitter -> Youtube [label="influencia"]
Facebook -> Youtube [label="influencia"]
}

Modelagem de processos: um grafo pode ser utilizado para representar os processos de uma
empresa, com os vértices representando as atividades e as arestas representando as dependências
entre elas (por exemplo, uma atividade que só pode ser iniciada após o término de outra).
Exemplo de grafo:
digraph {
Inicio -> A
A -> B
A -> C
B -> D
C -> D
D -> F
F -> Fim
}

Mapa de rotas de ônibus: um grafo não direcionado onde as paradas de ônibus são os vértices e as
rotas entre elas são as arestas.
graph {
"Bus Stop A" -- "Bus Stop B"
"Bus Stop B" -- "Bus Stop C"
"Bus Stop A" -- "Bus Stop C"
"Bus Stop C" -- "Bus Stop D"
}

Estrutura de dependência de um projeto: um grafo direcionado onde as tarefas são os vértices e as


dependências entre elas são as arestas.
digraph {
"Task A" -> "Task B"
"Task B" -> "Task C"
"Task A" -> "Task C"
"Task C" -> "Task D"
}

2.1)
Um grafo é uma estrutura matemática composta por um conjunto de vértices (ou nós) e um
conjunto de arestas que conectam esses vértices. As arestas podem ser direcionais (setas que
indicam a direção da conexão) ou não-direcionais (linhas que apenas conectam os vértices).

graph q2a {
// define os nós
A;
B;
C;
D;
E;

// define as arestas
A -- B;
A -- C;
B -- C;
B -- D;
C -- D;
C -- E;
}

2.2)
Um grafo simples é um tipo de grafo não-direcionado em que não há arestas paralelas (ou seja, não
há mais de uma aresta conectando o mesmo par de vértices) e nem há laços (arestas que conectam
um vértice a ele mesmo).

graph q2b {
// define os nós
A;
B;
C;
D;

// define as arestas
A -- B;
A -- C;
B -- C;
C -- D;
}

2.3)
Um grafo direcionado (também conhecido como digrafo) é um tipo de grafo em que as arestas têm
uma direção específica, ou seja, elas vão de um vértice de origem para um vértice de destino. Isso
significa que, em um grafo direcionado, as conexões entre os vértices podem ser unidirecionais.

digraph q2c {
// define os nós
A;
B;
C;
D;
E;

// define as arestas
A -> B;
A -> C;
B -> C;
B -> D;
C -> D;
C -> E;
}

2.4)
Um multigrafo é um tipo de grafo que permite múltiplas arestas conectando o mesmo par de
vértices. Isso significa que é possível ter mais de uma aresta que liga o mesmo vértice de origem ao
mesmo vértice de destino, o que diferencia o multigrafo dos grafos simples.

graph q2d {
// define os nós
A;
B;
C;
D;

// define as arestas
A -- B;
A -- B;
A -- C;
B -- C;
B -- D;
C -- D;
}

2.5)
Um grafo ponderado é um tipo de grafo em que as arestas têm um peso ou valor associado a elas.
Isso significa que, além de indicar a existência de uma conexão entre os vértices, as arestas também
têm uma medida quantitativa que reflete algum tipo de informação relevante para o problema em
questão.

graph q2e {
// define os nós
A;
B;
C;
D;
E;

// define as arestas e seus pesos


A -- B [label=4];
A -- C [label=2];
B -- C [label=1];
B -- D [label=5];
C -- D [label=8];
C -- E [label=10];
D -- E [label=2];
}

2.6)
Um grafo rotulado é um tipo de grafo em que cada vértice tem um rótulo ou etiqueta associada a
ele. Isso significa que, em vez de utilizar letras ou números para representar os vértices, cada um
deles é identificado por uma palavra ou expressão que reflete alguma informação relevante para o
problema em questão.
graph q2f {
// define os nós com rótulos
"Mossoró" -- "Tibau";
"Mossoró" -- "Areia Branca";
"Mossoró" -- "Grossos";
"Tibau" -- "Grossos";
"Areia Branca" -- "Grossos";

// define o estilo de rótulo dos vértices


node [shape=circle fontsize=12];
}

2.7)
Uma rede é um tipo de grafo que é usado para modelar sistemas complexos em que os nós podem
ter múltiplas conexões e as conexões podem ter direções e/ou pesos associados. Exemplos de redes
incluem redes de transporte, redes de computadores e redes sociais.

digraph q2g {
// define os nós
A [label="Servidor A"];
B [label="Servidor B"];
C [label="Servidor C"];
D [label="Usuário 1"];
E [label="Usuário 2"];
F [label="Usuário 3"];
G [label="Usuário 4"];

// define as conexões
A -> B [label="100 Mbps"];
A -> C [label="50 Mbps"];
B -> A [label="100 Mbps"];
B -> C [label="20 Mbps"];
C -> A [label="50 Mbps"];
C -> B [label="20 Mbps"];
D -> A [label="10 Mbps"];
E -> B [label="5 Mbps"];
F -> C [label="2 Mbps"];
G -> B [label="1 Mbps"];

// define o estilo dos nós e das conexões


node [shape=box fontsize=12 fontname="Arial"];
edge [fontsize=10 fontname="Arial"];
}

2.8)
Em um grafo, o conceito de vértice adjacente (ou vizinho) é fundamental. Um vértice adjacente a
um determinado vértice é aquele que está diretamente conectado a ele por uma aresta.
Neste exemplo, o vértice adjacente ao vértice A é o vértice B, que está diretamente conectado a ele
por uma aresta. O vértice B foi destacado em vermelho para facilitar a visualização.

graph example {
// define os nós
A -- B;
A -- C;
A -- D;
B -- C;
C -- D;
D -- E;
E -- F;

// define o vértice adjacente


B [color=red];

// define o estilo dos vértices e das arestas


node [shape=circle fontsize=12];
edge [fontsize=10];
}

2.9)
Em um grafo, a vizinhança de um determinado vértice é o conjunto de todos os vértices adjacentes a
ele. Ou seja, a vizinhança é composta pelo próprio vértice e todos os seus vizinhos.
Neste exemplo, a vizinhança do vértice A é composta pelo próprio vértice A e pelos vértices B, C e
D, que estão diretamente conectados a ele por arestas. Os vértices B, C e D foram destacados em
azul para facilitar a visualização da vizinhança.

graph example {
// define os nós
A -- B;
A -- C;
A -- D;
B -- C;
C -- D;
D -- E;
E -- F;

// define a vizinhança do vértice A


A [color=red];
B [color=blue];
C [color=blue];
D [color=blue];

// define o estilo dos vértices e das arestas


node [shape=circle fontsize=12];
edge [fontsize=10];
}

2.10)
Em um grafo, o grau de um nó (ou vértice) é o número de arestas que estão conectadas a ele. Em
outras palavras, o grau é o número de vizinhos que o nó possui.
Neste exemplo, o vértice A possui grau 3, pois está conectado a três vértices vizinhos: B, C e D. Os
vértices B, C e D possuem grau 2, 3 e 3, respectivamente, pois estão conectados a dois, três e três
vizinhos cada um. Os vértices E e F possuem grau 1 cada um, pois estão conectados a apenas um
vizinho cada um.

graph example {
// define os nós
A -- B;
A -- C;
A -- D;
B -- C;
C -- D;
D -- E;
E -- F;

// define o grau dos vértices


A [label="A (grau 3)"];
B [label="B (grau 2)"];
C [label="C (grau 3)"];
D [label="D (grau 3)"];
E [label="E (grau 1)"];
F [label="F (grau 1)"];
// define o estilo dos vértices e das arestas
node [shape=circle fontsize=12];
edge [fontsize=10];
}

2.11)
Em um grafo direcionado, um vértice sucessor de um dado vértice é um vértice que é conectado a
ele através de uma aresta que sai desse vértice. Da mesma forma, um vértice antecessor de um
dado vértice é um vértice que é conectado a ele através de uma aresta que entra nele.
Neste exemplo, o vértice A possui dois vértices sucessores (B e C), pois existem arestas que saem
dele e se conectam a esses vértices. Além disso, ele possui um vértice antecessor (E), pois existe
uma aresta que entra nele vinda desse vértice. O vértice B possui um vértice sucessor (C) e um
vértice antecessor (D). O vértice C possui um vértice sucessor (D) e dois vértices antecessores (A e
B). O vértice D não possui vértices sucessores, mas possui um vértice antecessor (C). O vértice E
não possui vértices sucessores, mas possui um vértice antecessor (A).

digraph example {
// define os nós
A -> B;
A -> C;
B -> C;
C -> D;
D -> B;
E -> A;

// define o estilo dos vértices e das arestas


node [shape=circle fontsize=12];
edge [fontsize=10];

// define as cores dos vértices sucessores e antecessores


A [color=blue];
B [color=green];
C [color=green];
D [color=red];
E [color=blue];

// define os rótulos dos vértices


A [label="A"];
B [label="B"];
C [label="C"];
D [label="D"];
E [label="E"];
}

2.12)
O fecho transitivo de um grafo direcionado é um subconjunto do grafo que contém todos os
vértices e todas as arestas que permitem chegar de um vértice a outro através de um caminho. Em
outras palavras, é o conjunto de todos os pares de vértices (u, v) onde existe um caminho que leva
do vértice u ao vértice v no grafo original.
Neste exemplo, o fecho transitivo do grafo é composto pelos vértices A, B, C, D, E, F e G, e pelas
seguintes arestas: (A, B), (B, C), (C, D), (D, E), (E, F), (F, G) e (G, D). As arestas do fecho
transitivo são mostradas com estilo pontilhado e cor vermelha para distingui-las das arestas do grafo
original.

digraph example {
// define os nós e as arestas
A -> B;
B -> C;
C -> D;
D -> E;
E -> F;
F -> G;
G -> D;

// define o estilo dos vértices e das arestas


node [shape=circle fontsize=12];
edge [fontsize=10];

// define o estilo do fecho transitivo


subgraph closure {
edge [style=dashed color=red];
A -> B -> C -> D -> E -> F -> G -> D;
}

// define os rótulos dos vértices


A [label="A"];
B [label="B"];
C [label="C"];
D [label="D"];
E [label="E"];
F [label="F"];
G [label="G"];
}

2.14)
O fecho transitivo direto é um subconjunto do grafo que contém apenas os pares de vértices que
têm um caminho direto entre si. Já o fecho transitivo indireto contém os pares de vértices que
estão conectados por um caminho indireto, ou seja, através de um ou mais vértices intermediários.
Neste exemplo, o fecho transitivo direto do grafo é composto pelos vértices A, B, C, D, E e F, e
pelas seguintes arestas: (A, B), (B, C), (C, D), (D, E) e (E, F). As arestas do fecho transitivo direto
são mostradas com estilo pontilhado e cor vermelha para distingui-las das arestas do grafo original.
O fecho transitivo indireto do grafo é composto por todas as arestas que ligam vértices que não
estão diretamente conectados no grafo original. Essas arestas são mostradas com estilo pontilhado e
cor azul. Note que o fecho transitivo indireto inclui todas as arestas do fecho transitivo direto, além
de outras arestas que conectam vértices indiretamente.

digraph example {
// define os nós e as arestas
A -> B;
B -> C;
C -> D;
D -> E;
E -> F;
F -> G;
G -> D;

// define o estilo dos vértices e das arestas


node [shape=circle fontsize=12];
edge [fontsize=10];

// define o estilo do fecho transitivo direto


subgraph closure_direct {
edge [style=dashed color=red];
A -> B -> C -> D -> E -> F;
}

// define o estilo do fecho transitivo indireto


subgraph closure_indirect {
edge [style=dashed color=blue];
A -> C;
A -> D;
A -> E;
B -> D;
B -> E;
B -> F;
C -> E;
C -> F;
C -> G;
D -> F;
D -> G;
E -> G;
}

// define os rótulos dos vértices


A [label="A"];
B [label="B"];
C [label="C"];
D [label="D"];
E [label="E"];
F [label="F"];
G [label="G"];
}

2.15)
Um grafo completo é um grafo em que cada par de vértices é conectado por uma aresta. Ou seja,
todos os vértices estão interligados entre si.

graph {
A -- B;
A -- C;
A -- D;
B -- C;
B -- D;
C -- D;
}

2.16)
Um grafo bipartido é um grafo cujos vértices podem ser divididos em dois conjuntos disjuntos, de
tal forma que todas as arestas ligam um vértice de um conjunto a um vértice do outro conjunto. Esse
tipo de grafo é muito usado para modelar relacionamentos entre dois conjuntos distintos de objetos.
Observe que os vértices estão divididos em dois conjuntos disjuntos: A, B e C formam um conjunto,
enquanto D, E e F formam outro conjunto. Além disso, todas as arestas conectam vértices de
conjuntos diferentes.

graph {
node [shape=circle];
// Conjunto 1
A [label="A"];
B [label="B"];
C [label="C"];
// Conjunto 2
D [label="D"];
E [label="E"];
F [label="F"];
// Conexões
A -- D;
A -- E;
B -- D;
B -- F;
C -- E;
C -- F;
}

2.17)
Um subgrafo é um grafo que é obtido a partir de outro grafo removendo-se um ou mais vértices
e/ou arestas. O subgrafo mantém a estrutura básica do grafo original, mas pode ter menos vértices
e/ou arestas.
Observe que o subgrafo é formado pelos vértices B, C, D, E e F e pelas arestas que os conectam,
mantendo a estrutura básica do grafo original, mas sem os vértices A e a aresta A-B. Além disso, no
subgrafo foi adicionada uma nova aresta entre os vértices E e F.

graph {
// Vértices
A;
B;
C;
D;
E;
F;
// Arestas
A -- B;
A -- C;
B -- C;
C -- D;
D -- E;
D -- F;

// Subgrafo
subgraph sg1 {
B;
C;
D;
E;
F;
// Uma nova aresta no subgrafo
E -- F;
}
}

2.18)
Um grafo parcial é um subgrafo de um grafo completo, ou seja, um grafo que possui apenas
algumas das arestas que existem no grafo completo. Dessa forma, um grafo parcial não precisa
necessariamente conectar todos os seus vértices, como ocorre em um grafo completo.
Observe que o grafo parcial contém apenas as arestas A-B, A-C e C-D, removendo a aresta B-C que
existia no grafo completo. Como resultado, o vértice B não se conecta diretamente ao vértice D
neste grafo.

graph {
// Vértices
A;
B;
C;
D;
// Arestas
A -- B;
A -- C;
B -- C;
C -- D;

// Grafo parcial
subgraph sg1 {
// Removendo a aresta B-C
A -- B [color=red];
A -- C [color=red];
C -- D [color=red];
}
}

2.19)
Um caminho em um grafo é uma sequência de vértices em que cada vértice é adjacente ao vértice
subsequente. Por exemplo, um caminho entre os vértices A e D em um grafo.
Observe que o caminho entre A e D é formado pelos vértices A, B, C e D, e as arestas que ligam
esses vértices formam uma sequência contínua de vértices adjacentes.

graph {
// Vértices
A;
B;
C;
D;

// Arestas
A -- B;
B -- C;
C -- D;
}

2.20)
Um passeio ou caminhada, em um grafo é uma sequência de vértices e arestas em que cada aresta
conecta vértices adjacentes na sequência. Um passeio não precisa ser necessariamente simples, ou
seja, a mesma aresta pode ser percorrida mais de uma vez e o mesmo vértice pode aparecer mais de
uma vez na sequência.
Observe que o passeio é representado pelas arestas A -- D -- C -- B -- A -- D.

graph {
// Vértices
A;
B;
C;
D;
E;

// Arestas
A -- B;
B -- C;
C -- D;
D -- E;
A -- D;
A -- D;
E -- D;
D -- C;
B -- A;
B -- C;
C -- B;
D -- A;

// Passeio
A -- D -- C -- B -- A -- D;
}

2.21)
Uma cadeia ou trilha é uma sequência de vértices em que cada vértice é adjacente ao próximo na
sequência, mas não necessariamente conectado a todos os outros vértices na sequência. Em outras
palavras, uma cadeia ou trilha é um passeio sem vértices repetidos.
Neste exemplo, a cadeia destacada é 2-4-5, que é uma sequência de vértices adjacentes, mas não
conectados a todos os outros vértices na sequência.

digraph G {
node [shape=circle];
1 -> 2 -> 4 -> 5;
2 -> 3 -> 4;
3 -> 6;

{rank=same; 1 2 3}
{rank=same; 4 5 6}

edge [color=red];
2 -> 4 -> 5;
}

2.22)
Um ciclo é um passeio que começa e termina em um mesmo vértice e passa por outros vértices sem
repetição. Em outras palavras, é uma sequência de vértices onde o primeiro e o último são iguais e
não há repetições no meio.
Nesse exemplo, temos um ciclo formado pelos vértices A, B, C, D e E. Note que a aresta que fecha
o ciclo é representada com dir=none, indicando que ela é bidirecional.
digraph G {
rankdir=LR;
A -> B;
B -> C;
C -> D;
D -> E;
E -> A [dir=none];
}

2.23)
Um circuito em um grafo é um passeio fechado que não repete vértices, exceto pelo primeiro e
último vértices. Em outras palavras, é um ciclo que passa por cada vértice do grafo apenas uma vez.
Neste exemplo, o circuito é formado pelos vértices 1, 2, 3 e 4, que são percorridos em
sequência, e depois retorna ao vértice 1, formando um ciclo. O vértice 5 não faz parte
do circuito, pois não é visitado mais de uma vez.

digraph G {
1 -> 2 -> 3 -> 4 -> 1;
4 -> 5;
}

2.24)
Percurso ou Rota é uma sequência de arestas distintas que conectam um conjunto de
vértices em um grafo. É semelhante a um caminho, porém, diferentemente do caminho, pode visitar
o mesmo vértice várias vezes.
Nesse exemplo, o percurso começa no vértice 1, passa pelos vértices 2, 6, 10, 11, 12, 9, e termina no
vértice 14. A aresta que liga os vértices 9 e 14 está colorida em vermelho para destacar que ela faz
parte do percurso.

digraph {
1 -> 2;
2 -> 3;
3 -> 4;
4 -> 5;
5 -> 2;
2 -> 6;
6 -> 7;
7 -> 8;
8 -> 9;
9 -> 6;
6 -> 10;
10 -> 11;
11 -> 12;
12 -> 9;
9 -> 13;
13 -> 14;
14 -> 15;
15 -> 12;
1 -> 6;
3 -> 8;
5 -> 10;
7 -> 12;
9 -> 14 [color="red"];
}

2.25)
Um ciclo euleriano é um ciclo que passa por cada aresta de um grafo exatamente uma vez. Um
circuito euleriano é um ciclo euleriano que começa e termina no mesmo vértice.
Um grafo é euleriano se tiver um ciclo euleriano, enquanto que um grafo sem ciclos eulerianos é
dito não euleriano.

graph euleriano {
1 -- 2 -- 3 -- 4 -- 1;
1 -- 3;
2 -- 4;
}

2.26)
Um ciclo/circuito Hamiltoniano é um ciclo/circuito que passa por todos os vértices de um grafo
exatamente uma vez. Esse tipo de ciclo recebe esse nome em homenagem ao matemático e físico
irlandês William Rowan Hamilton.
Segue um exemplo de um grafo não-direcionado com um ciclo Hamiltoniano.
Nesse grafo, podemos observar que é possível encontrar um ciclo que passa por todos os vértices:
1-2-3-4-5-1. Portanto, ele é um grafo Hamiltoniano.

graph {
1 -- 2 -- 3 -- 4 -- 5 -- 1;
1 -- 3;
2 -- 4;
3 -- 5;
4 -- 1;
5 -- 2;
}
2.27)
Em teoria dos grafos, a cintura e a circunferência de um grafo são medidas que descrevem sua
estrutura. A cintura de um grafo é o tamanho do menor ciclo no grafo, enquanto a circunferência é o
comprimento do maior ciclo.
Um grafo pode ter mais de uma circunferência, mas tem apenas uma cintura. Se o grafo não
contiver ciclo, sua cintura e circunferência serão ambos infinitos.
Neste exemplo, o ciclo de tamanho 3 é formado pelos vértices 1, 2 e 3, enquanto o ciclo de tamanho
4 é formado pelos vértices 1, 5, 6 e 2. Portanto, a cintura deste grafo é
3 e a circunferência é 4.

digraph exemplo {
1 -> 2;
2 -> 3;
3 -> 4;
4 -> 1;
1 -> 5;
2 -> 6;
3 -> 7;
4 -> 8;
5 -> 6;
6 -> 7;
7 -> 8;
8 -> 5;
}

2.28)
O raio de um grafo é o menor valor entre as distâncias de um vértice para todos os outros vértices
do grafo. O diâmetro de um grafo é a maior distância entre quaisquer dois vértices do grafo.
Nesse exemplo, o vértice 1 é destacado em vermelho, já que ele é o centro do grafo com raio 2. Já a
aresta entre os vértices 3 e 7 é destacada em azul e em negrito, pois ela faz parte do caminho mais
longo do grafo, determinando seu diâmetro igual a 5.

graph {
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7;
1 -- 3;
2 -- 4 -- 6;
5 -- 7;

// raio
1 [color=red, style=filled];

// diâmetro
3 -- 7 [color=blue, style=bold];
}
2.29)
O centro de um grafo é definido como o conjunto de vértices com a menor excentricidade (a maior
distância para qualquer outro vértice). Já a mediana é o vértice (ou um conjunto de vértices) que
minimiza a soma das distâncias para todos os outros vértices do grafo.
Abaixo segue um exemplo de grafo com destaque para o centro (em amarelo) e mediana (em
vermelho):
Aqui temos um grafo com 20 vértices e 26 arestas, com o centro destacado em amarelo (vértices 1,
5, 9, 11 e 13) e a mediana em vermelho (vértice 9). Note que a escolha da mediana pode não ser
única, dependendo do grafo em questão.

graph centro_mediana {
node [shape=circle, style=filled, color=black, fontcolor=white];
edge [color=black];

1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20;

1 -- 2;
1 -- 3;
2 -- 3;
2 -- 4;
3 -- 5;
4 -- 5;
4 -- 6;
5 -- 7;
6 -- 7;
6 -- 8;
7 -- 9;
8 -- 9;
8 -- 10;
9 -- 11;
10 -- 11;
10 -- 12;
11 -- 13;
12 -- 13;
12 -- 14;
13 -- 15;
14 -- 15;
14 -- 16;
15 -- 17;
16 -- 17;
16 -- 18;
17 -- 19;
18 -- 19;
18 -- 20;
19 -- 20;

1 [color=yellow];
5 [color=yellow];
9 [color=yellow];
11 [color=yellow];
13 [color=yellow];
9 [color=red];
}

2.30)
A distância entre dois nós em um grafo é o menor caminho entre eles. Para exemplificar, vamos
considerar o seguinte grafo simples:

1 -- 2 -- 3 -- 4 – 5;

O menor caminho entre os nós 1 e 5 é através dos nós 2, 3 e 4. Podemos representar a


distância entre eles adicionando as respectivas arestas em vermelho.
A distância entre 1 e 5 é 3.

graph {
1 -- 2 [color=red];
2 -- 3 [color=red];
3 -- 4 [color=red];
4 -- 5;
}

2.31)
A excentricidade de um vértice é a maior distância entre esse vértice e qualquer outro vértice do
grafo. Ou seja, é a distância máxima que esse vértice está de qualquer outro vértice do grafo.
Segue um exemplo de um grafo com a excentricidade do vértice "1" destacada.
Nesse grafo, a excentricidade do vértice "1" é 4, pois ele está a uma distância máxima de 4 em
relação a qualquer outro vértice do grafo. O vértice "1" está conectado com o vértice "3" com uma
aresta de peso 3, e esse é o caminho mais longo para qualquer outro vértice do grafo. O vértice "1"
também está a uma distância de 4 do vértice "5", passando pelos vértices "3" e "4". O vértice "1"
está a uma distância de 3 do vértice "2", passando pelos vértices "3" e "5".

digraph G {
1 [color=red];
1 -> 2 [label=1];
1 -> 3 [label=3];
2 -> 3 [label=2];
2 -> 4 [label=1];
3 -> 5 [label=2];
4 -> 3 [label=1];
4 -> 5 [label=2];
5 -> 2 [label=1];
5 -> 4 [label=1];
}

2.32)
Um clique é um subconjunto de vértices em um grafo onde cada par de vértices é adjacente. Já um
clique maximal é um clique que não é subconjunto de nenhum outro clique.
Neste exemplo, temos os seguintes cliques e cliques maximais:

Clique: {2, 3, 4}
Clique: {4, 5, 6, 7}
Clique: {8, 9, 10, 11}
Clique Maximal: {2, 3, 4}
Clique Maximal: {4, 5, 6, 7}
Clique Maximal: {8, 9, 10, 11}

graph {
1 -- 2 -- 3;
2 -- 4;
3 -- 4;
4 -- 5 -- 6;
5 -- 7;
6 -- 7;
8 -- 9 -- 10 -- 8;
9 -- 11;
10 -- 11;

subgraph cluster1 {
style=filled;
color=lightgrey;
2 -- 3 -- 4;
}

subgraph cluster2 {
style=filled;
color=lightgrey;
4 -- 5 -- 6;
5 -- 7;
6 -- 7;
}

subgraph cluster3 {
style=filled;
color=lightgrey;
8 -- 9 -- 10;
9 -- 11;
10 -- 11;
}

{rank=same; 1,2,3,4}
{rank=same; 5,6,7}
{rank=same; 8,9,10,11}
}

2.33)
Um grafo cíclico é um grafo que contém pelo menos um ciclo, ou seja, um caminho fechado que
começa e termina no mesmo vértice.
Observe que o grafo contém um ciclo que passa por todos os vértices, começando e terminando no
vértice 1.

graph grafo_ciclico {
1 -- 2 -- 3 -- 4 -- 5 -- 1;
}

2.34)
Um grafo acíclico é um grafo que não possui ciclos. Ou seja, não há um caminho que comece e
termine em um mesmo vértice.

digraph {
rankdir=LR;
A -> B;
A -> C;
B -> D;
C -> D;
D -> E;
E -> F;
}

2.35)
Grafos isomorfos são grafos que possuem a mesma estrutura, mas possivelmente diferentes rótulos
nos vértices. Para representar grafos isomorfos, podemos utilizar a mesma estrutura com rótulos
diferentes.
Ambos os grafos possuem a mesma estrutura, com quatro vértices conectados em um ciclo. No
entanto, as letras representando os vértices no Grafo 2 são diferentes dos números utilizados no
Grafo 1. Mesmo assim, podemos dizer que os dois grafos são
isomorfos.

// Grafo 1
graph {
1 -- 2;
2 -- 3;
3 -- 4;
4 -- 1;
}

// Grafo 2
graph {
A -- B;
B -- C;
C -- D;
D -- A;
}
2.36)
Um grafo planar é um grafo que pode ser desenhado em um plano sem que as arestas se cruzem.
Este grafo é conhecido como "Grafo de Petersen" e é um exemplo clássico de um grafo planar. Ele
possui 10 vértices e 15 arestas. Observe que todas as arestas estão dispostas de tal maneira que não
se cruzam, satisfazendo a definição de um grafo planar.

graph {
1 -- 2 -- 3 -- 4 -- 5 -- 1
1 -- 6 -- 4
2 -- 6 -- 3
5 -- 6
}

2.37)
Um grafo induzido é um subgrafo obtido a partir da seleção de um subconjunto de vértices do
grafo original e das arestas correspondentes entre eles. Em outras palavras, um grafo induzido é um
subgrafo que mantém as conexões entre um subconjunto de vértices do grafo original.
A seguir, segue um exemplo de grafo induzido em que é selecionado um subconjunto de vértices {1,
2, 4} do grafo original e suas respectivas arestas
Nesse exemplo, o subgrafo induzido é representado em vermelho e consiste nos vértices {1, 2, 4} e
nas arestas que conectam esses vértices no grafo original.

graph G {
1 -- 2 [label="4"]
2 -- 3 [label="3"]
3 -- 4 [label="2"]
4 -- 5 [label="5"]
1 -- 4 [label="1"]
2 -- 4 [label="6"]

// seleção do subconjunto de vértices {1, 2, 4} e suas


// arestas correspondentes
subgraph cluster_induzido {
1 -- 2 [color=red, label="4"]
1 -- 4 [color=red, label="1"]
2 -- 4 [color=red, label="6"]
}
}

2.38)
O grafo dual de um grafo plano é um grafo que representa a dualidade dos polígonos que compõem
o grafo original. Em outras palavras, cada face do grafo plano corresponde a um vértice no grafo
dual, e cada aresta que compartilha duas faces no grafo plano se torna uma aresta que conecta os
vértices correspondentes no grafo dual.
Neste exemplo, o grafo plano é definido pelos vértices 1, 2, 3, 4 e 5, e pelas arestas que os
conectam. O grafo dual é obtido transformando cada face do grafo plano em um vértice no grafo
dual, e cada aresta que compartilha duas faces em uma aresta que conecta os vértices
correspondentes. Note que o grafo dual também é plano, e que os vértices correspondentes no grafo
dual são numerados de forma a refletir as bordas do grafo plano original.

graph plano {
1 -- 2 -- 3 -- 4 -- 1
2 -- 4
3 -- 5 -- 4
1 -- 5 -- 2
3 -- 1
}

graph dual {
0 -- 2 -- 4 -- 3 -- 1 -- 0
1 -- 2
0 -- 3
1 -- 4
0 -- 1
}

2.39)
Um grafo é considerado perfeito se, para todo subgrafo induzido H, o número cromático de H é
igual ao tamanho máximo do conjunto independente em H.
Um exemplo de grafo perfeito é o grafo de Petersen. Este grafo tem tamanho máximo de conjunto
independente 2 e número cromático 3 em todos os seus subgrafos induzidos, portanto é um grafo
perfeito.
Este grafo tem tamanho máximo de conjunto independente 2 e número cromático 3 em todos os
seus subgrafos induzidos, portanto é um grafo perfeito.

graph {
node [shape=circle, style=filled, fillcolor=lightblue, color=black, fontsize=16];
edge [color=black, penwidth=1.5];

0 -- 1 -- 2 -- 3 -- 4 -- 0;
5 -- 6 -- 7 -- 8 -- 9 -- 5;
0 -- 5;
1 -- 6;
2 -- 7;
3 -- 8;
4 -- 9;
0 -- 7;
1 -- 8;
2 -- 9;
3 -- 5;
4 -- 6;
}

2.40)
Um grafo é dito conexo se existe um caminho entre qualquer par de vértices do grafo. Em outras
palavras, não existem vértices isolados no grafo.
graph {
A -- B;
B -- C;
C -- D;
D -- E;
E -- A;
}

2.41)
Componente conexa é uma subrede de um grafo onde qualquer par de vértices é conectado por um
caminho. Um grafo é considerado conexo se possui apenas uma componente conexa.
Já em um grafo direcionado, um componente fortemente conexa é uma subrede onde qualquer par
de vértices é alcançável a partir do outro através de um caminho dirigido.
Exemplo de componente conexa em um grafo não-direcionado:

graph {
1 -- 2 -- 3 -- 4;
5 -- 6 -- 7;
8 -- 9 -- 10 -- 11 -- 8;
2 -- 10;
}

Nesse exemplo, há três componentes conexas: {1, 2, 3, 4, 10}, {5, 6, 7}


e {8, 9, 11}.
Exemplo de componente fortemente conexa em um grafo direcionado:

digraph {
1 -> 2 -> 3 -> 4 -> 1;
5 -> 6 -> 5;
7 -> 8 -> 9 -> 7;
10 -> 11;
11 -> 12 -> 13 -> 10;
13 -> 14 -> 11;
}

Nesse exemplo, há duas componentes fortemente conexas: {1, 2, 3, 4} e {5, 6} e as demais


componentes são formadas por apenas um vértice cada.

2.42)
A matriz de adjacência é uma forma de representação de um grafo por meio de uma matriz
booleana. Cada linha e coluna da matriz representa um vértice do grafo e a presença de um valor 1
na posição (i,j) indica a existência de uma aresta entre os vértices i e j.

// Grafo
digraph G {
1 -> 2;
1 -> 3;
2 -> 3;
2 -> 4;
3 -> 4;
}

graph {
rankdir=LR;
matrix [shape=plaintext, label=<
<table border="0" cellborder="1" cellspacing="0">
<tr><td></td><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>1</td><td>0</td><td>1</td><td>1</td><td>0</td></tr>
<tr><td>2</td><td>1</td><td>0</td><td>1</td><td>1</td></tr>
<tr><td>3</td><td>1</td><td>1</td><td>0</td><td>1</td></tr>
<tr><td>4</td><td>0</td><td>1</td><td>1</td><td>0</td></tr>
</table>
>];
}

2.43)
A matriz de incidência é uma representação de um grafo que mostra as relações entre seus vértices
e arestas. Cada linha representa um vértice e cada coluna representa uma aresta, indicando se um
vértice está conectado ou não a uma aresta. O valor -1 indica que o vértice é o extremo inicial da
aresta, o valor 1 indica que o vértice é o extremo final da aresta e o valor 0 indica que o vértice não
está conectado à aresta.

graph {
node [shape=circle, style=filled, color=white]
edge [color=black]

// vértices
A; B; C; D;

// arestas
AB -- BD [label="1"];
AB -- CD [label="2"];
CD -- BD [label="3"];
AC -- CD [label="4"];

// matriz de incidência
{rank=min; A; B; C; D;}
node [shape=rectangle, style=filled, color=lightgray, height=0.8, width=1.2]
matrix [label=<
<table border="0" cellborder="1" cellspacing="0">
<tr><td></td><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>A</td><td>1</td><td>1</td><td>0</td><td>-1</td></tr>
<tr><td>B</td><td>1</td><td>0</td><td>1</td><td>-1</td></tr>
<tr><td>C</td><td>0</td><td>1</td><td>1</td><td>1</td></tr>
<tr><td>D</td><td>0</td><td>0</td><td>1</td><td>0</td></tr>
</table>
>];
}

2.44)
Uma lista de adjacência (ou lista encadeada) é uma estrutura de dados utilizada para representar
grafos por meio de uma lista que contém as informações dos vértices e suas respectivas arestas
adjacentes. Cada vértice do grafo é representado por um nó na lista encadeada, que armazena a lista
de seus vizinhos (vértices adjacentes).

graph {
0 -- 1;
0 -- 2;
1 -- 3;
2 -- 3;

0 -- 1 -- 3 -- 2 -- 0 [style=invis];

node [shape=circle];
0 [label=0];
1 [label=1];
2 [label=2];
3 [label=3];

node [shape=plaintext];
0 -- "1, 2";
1 -- "0, 3";
2 -- "0, 3";
3 -- "1, 2";
}
Neste exemplo, a lista de adjacência para o vértice 0 é "1, 2", pois o vértice 0 tem arestas
conectando-o aos vértices 1 e 2. A lista de adjacência para o vértice 1 é "0, 3", pois o vértice 1 tem
arestas conectando-o aos vértices 0 e 3, e assim por diante. Note que como o grafo é não
direcionado, as listas de adjacência para cada vértice contêm todos os seus vizinhos,
independentemente da direção das arestas.

2.45)
Uma árvore é um tipo especial de grafo acíclico em que há um vértice distinto chamado de raiz, e
todos os demais vértices estão ligados a um e somente um outro vértice, exceto pela raiz, que não
possui um vértice pai.
digraph {
1 -> 2;
1 -> 3;
2 -> 4;
2 -> 5;
}

Nessa árvore, o vértice 1 é a raiz e os demais vértices são numerados de 2 a 5. Cada vértice, exceto
a raiz, possui um vértice pai (por exemplo, o vértice 4 é filho do vértice 2). Além disso, cada vértice
possui, no máximo, um único vértice pai. A partir da raiz, é possível percorrer todos os vértices da
árvore seguindo um caminho único, formando assim uma estrutura hierárquica.

2.46)
Uma sub-árvore de um grafo é uma árvore que é formada a partir de um subconjunto de vértices e
suas respectivas arestas, de modo que essa sub-árvore também seja um subgrafo do grafo original.

digraph G {
1 -> 2;
1 -> 3;
2 -> 4;
2 -> 5;
3 -> 6;
3 -> 7;
5 -> 8;
5 -> 9;
5 -> 10;
9 -> 11;
9 -> 12;
9 -> 13;
}

A sub-árvore pode ser formada a partir do vértice 5 e seus descendentes (nós 8, 9, 10, 11, 12 e 13)

digraph sub {
5 -> 8;
5 -> 9;
5 -> 10;
9 -> 11;
9 -> 12;
9 -> 13;
}

2.47)
Uma raiz em uma árvore é um nó especial que é o ponto de partida da árvore. Todos os outros nós
são acessíveis a partir da raiz por meio de caminhos únicos. Abaixo está um exemplo de uma árvore
com o nó "A" como raiz:

digraph G {
A -> B;
A -> C;
B -> D;
B -> E;
C -> F;
}

2.48)
Uma folha em uma árvore é um nó que não possui filhos. Ele é chamado assim porque é
representado como uma folha em um ramo da árvore.

digraph {
1 -> 2;
1 -> 3;
2 -> 4;
2 -> 5;
3 -> 6;
3 -> 7;
7 -> 8;
7 -> 9;
8 [shape=box]; // folha
9 [shape=box]; // folha
}
Aqui, os nós 8 e 9 são folhas, pois não têm filhos. Eles são representados como caixas com um
único ponto de saída. Os outros nós são representados como círculos. A aresta que leva a uma folha
é direcionada para a própria folha.

2.49)
O tamanho de uma árvore é o número total de nós presentes na árvore. Incluindo a raiz e todas as
sub-árvores.
Segue abaixo um exemplo de uma árvore com tamanho 7:

digraph {
1 -> {2, 3};
2 -> {4, 5};
3 -> 6;
5 -> 7;
}

Nesse exemplo, a raiz é o nó 1 e as folhas são os nós 4, 6 e 7. A árvore tem tamanho 7, pois possui 7
nós no total.

2.50)
A profundidade (ou altura) de uma árvore é definida como a maior distância entre a raiz da
árvore e uma de suas folhas. Ou seja, é a quantidade máxima de arestas entre a raiz e uma folha.

digraph G {
node [shape=circle];
1 -> 2;
1 -> 3;
2 -> 4;
2 -> 5;
3 -> 6;
5 -> 7;
5 -> 8;
5 -> 9;
7 -> 10;
}

Essa árvore tem profundidade igual a 4, uma vez que a maior distância entre a raiz (nó 1) e qualquer
uma de suas folhas (nós 4, 6, 8 e 10) é de 4 arestas.

2.51)
Uma árvore balanceada é uma árvore em que a altura de suas subárvores é mantida próxima, o que
significa que o número de comparações necessárias para realizar a busca em uma árvore balanceada
é sempre menor ou igual à altura da árvore. Existem vários tipos de árvores balanceadas, como a
árvore AVL e a árvore rubro-negra.
Aqui está um exemplo de uma árvore AVL balanceada:

digraph {
node [shape=circle]

4 -> 2
4 -> 6
2 -> 1
2 -> 3
6 -> 5
6 -> 7
1 [color=green]
3 [color=green]
5 [color=green]
7 [color=green]
}
Neste exemplo, os nós verdes representam as folhas da árvore e todos os caminhos da raiz às folhas
têm a mesma altura.

2.52)
Um Heap é uma estrutura de dados em árvore binária em que todos os níveis da árvore são
preenchidos, exceto possivelmente o último, que é preenchido da esquerda para a direita. Em um
Heap, cada nó pai é maior ou igual ao seu nó filho (em um Heap máximo) ou menor ou igual ao seu
nó filho (em um Heap mínimo).
Um exemplo de Heap máximo é dado abaixo:

digraph G {
1 -> 2;
1 -> 3;
2 -> 4;
2 -> 5;
3 -> 6;
3 -> 7;
4 -> 8;
}

Este Heap máximo possui a raiz 1, que é o maior valor em todo o Heap. Cada nó pai é maior ou
igual aos seus nós filhos. O nó 8 é um nó folha, e todos os outros nós têm dois filhos (exceto os nós
folha). Note que este Heap não é balanceado, uma vez que a subárvore esquerda da raiz tem altura 2
e a subárvore direita tem altura 1. No entanto, ele ainda mantém a propriedade Heap, onde cada nó
pai é maior ou igual aos seus nós filhos.

2.53)
Uma árvore geradora de um grafo é um subgrafo que é uma árvore e contém todos os vértices do
grafo original.
Segue abaixo um exemplo de um grafo e sua árvore geradora, destacada em azul:

digraph {
1 -> 2 [label="6"]
1 -> 3 [label="1"]
1 -> 4 [label="5"]
2 -> 3 [label="5"]
2 -> 5 [label="3"]
3 -> 4 [label="5"]
3 -> 5 [label="6"]
3 -> 6 [label="4"]
4 -> 6 [label="2"]
5 -> 6 [label="6"]

1 -> 3 [label="1", color="blue"]


3 -> 4 [label="5", color="blue"]
4 -> 6 [label="2", color="blue"]
3 -> 5 [label="6", color="blue"]
2 -> 5 [label="3", color="blue"]
}

Neste exemplo, a árvore geradora é formada pelos vértices {1, 2, 3, 4, 5, 6} e pelas arestas {(1,3),
(3,4), (4,6), (3,5), (2,5)}.

2.54)
Uma árvore geradora mínima é uma árvore que conecta todos os vértices de um grafo com o
menor custo possível. O algoritmo de Kruskal e o algoritmo de Prim são comumente usados para
encontrar a árvore geradora mínima em um grafo ponderado.
Exemplo de representação visual de um grafo e sua árvore geradora mínima utilizando o algoritmo
de Kruskal:

graph {
node [shape=circle]
1 -- 2 [label=7]
1 -- 4 [label=6]
2 -- 3 [label=8]
2 -- 4 [label=9]
2 -- 5 [label=7]
3 -- 5 [label=5]
4 -- 5 [label=15]
4 -- 6 [label=9]
5 -- 6 [label=8]

node [shape=point]
edge [style=dashed, color=gray]
1 -- 2 [label=7]
1 -- 4 [label=6]
2 -- 5 [label=7]
3 -- 5 [label=5]
4 -- 1 [label=6]
5 -- 2 [label=7]
6 -- 5 [label=8]
}

Neste exemplo, temos um grafo não direcionado com seis vértices e nove arestas. A árvore geradora
mínima encontrada pelo algoritmo de Kruskal é destacada em cinza e as arestas não utilizadas são
representadas por linhas tracejadas em cinza.

2.55)
Uma Árvore Geradora Mínima com Restrição de Diâmetro é uma árvore geradora mínima em
que a distância máxima entre dois vértices é restrita a um valor máximo pré-determinado. Essa
restrição ajuda a limitar o número de arestas da árvore e a torná-la mais eficiente em termos de
recursos.
A seguir, um exemplo de um grafo com restrição de diâmetro igual a 2 e a respectiva Árvore
Geradora Mínima com Restrição de Diâmetro:

graph {
1 -- 2 [label=3]
1 -- 3 [label=1]
1 -- 4 [label=2]
2 -- 3 [label=2]
2 -- 5 [label=1]
3 -- 4 [label=1]
4 -- 5 [label=3]
4 -- 6 [label=2]
5 -- 6 [label=1]
{rank=same; 1 2 3}
{rank=same; 4 5 6}
}

A Árvore Geradora Mínima com Restrição de Diâmetro tem um total de 4 arestas, com um diâmetro
máximo de 2.

Você também pode gostar