SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
02  Grafos: estruturas de dados
SCC0503  Algoritmos e Estruturas de Dados II
Prof. Moacir Ponti Jr.
www.icmc.usp.br/~moacir
Instituto de Ciências Matemáticas e de Computação  USP
2011/1
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 1 / 33
Sumário
1 Recordando
2 Estruturas de Dados
Lista de Arcos
Lista de Adjacência
Matriz de Adjacência
Matriz de Incidência
3 Desempenho assintótico
4 Estruturas alternativas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 2 / 33
Digrafos
Directed graph, ou digrafo é um conjunto de vértices e um conjunto
de arcos
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 3 / 33
Arcos e Vértices
Um arco, é um par ordenado de vértices
Exemplo: v e w são vértices e v-w é um arco.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 4 / 33
Examinando um arco
O primeiro vértice do par ordenado é a ponta inicial do arco, e o
segundo a ponta nal.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 5 / 33
Conceitos Básicos
Um grafo G = (V, E) é composto de:
V: conjunto de vértices
E: conjunto de arestas
Se α = {v, w} é uma aresta de um grafo, dizemos que α liga os
vértices v e w, ou que incide em v (e em w).
V = {a, b, c, d, e}
E = {(a, b), (a, c), (a, d), (b, e),
(c, d), (c, e), (d, e)}
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 6 / 33
Adjacência e Grau
Vértices adjacentes: vértices conectados por uma aresta.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
Adjacência e Grau
Vértices adjacentes: vértices conectados por uma aresta.
Grau de um vértice: número de vértices adjacentes
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
Adjacência e Grau
Vértices adjacentes: vértices conectados por uma aresta.
Grau de um vértice: número de vértices adjacentes
Qual a soma dos graus de todos os vértices?
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
Adjacência e Grau
Vértices adjacentes: vértices conectados por uma aresta.
Grau de um vértice: número de vértices adjacentes
Qual a soma dos graus de todos os vértices?
O dobro de números de arestas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
Estruturas de Dados
Existem vários meios para se representar um grafo. Três estruturas são
mais comuns:
Lista de Arcos
Lista de Adjacência
Matriz de Adjacência
Matriz de Incidência
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 8 / 33
Estruturas de Dados: uma proposta em C
// Os vértices (0,1,..,V-1) são representados por um tipo Vertex.
#define Vertex int
// Uma estrutura do tipo ARC representa um arco
// com ponta inicial v e ponta final w.
typedef struct {
Vertex v;
Vertex w;
} ARC;
// A função Arc recebe dois vértices v, w e devolve
// um arco com ponta inicial v e ponta final w.
ARC Arc (Vertex v, Vertex w) {
ARC e;
e.v = v;
e.w = w;
return e;
}
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
Estruturas de Dados: uma proposta em C
// Os vértices (0,1,..,V-1) são representados por um tipo Vertex.
#define Vertex int
// Uma estrutura do tipo ARC representa um arco
// com ponta inicial v e ponta final w.
typedef struct {
Vertex v;
Vertex w;
} ARC;
// A função Arc recebe dois vértices v, w e devolve
// um arco com ponta inicial v e ponta final w.
ARC Arc (Vertex v, Vertex w) {
ARC e;
e.v = v;
e.w = w;
return e;
}
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
Estruturas de Dados: uma proposta em C
// Os vértices (0,1,..,V-1) são representados por um tipo Vertex.
#define Vertex int
// Uma estrutura do tipo ARC representa um arco
// com ponta inicial v e ponta final w.
typedef struct {
Vertex v;
Vertex w;
} ARC;
// A função Arc recebe dois vértices v, w e devolve
// um arco com ponta inicial v e ponta final w.
ARC Arc (Vertex v, Vertex w) {
ARC e;
e.v = v;
e.w = w;
return e;
}
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
Estruturas de Dados: uma proposta em C
// Os vértices (0,1,..,V-1) são representados por um tipo Vertex.
#define Vertex int
// Uma estrutura do tipo ARC representa um arco
// com ponta inicial v e ponta final w.
typedef struct {
Vertex v;
Vertex w;
} ARC;
// A função Arc recebe dois vértices v, w e devolve
// um arco com ponta inicial v e ponta final w.
ARC Arc (Vertex v, Vertex w) {
ARC e;
e.v = v;
e.w = w;
return e;
}
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
Estruturas de Dados: TAD digrafo
Um TAD digrafo deve fornecer algumas funções, por exemplo:
GRAPH initGraph(int)
destroyGraph(GRAPH)
insertArc(ARC)
searchArc(ARC)
removeArc(ARC)
GRAPH copyGraph(GRAPH)
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 10 / 33
Estruturas de Dados: TAD digrafo
Um TAD digrafo deve fornecer algumas funções, por exemplo:
GRAPH initGraph(int)
destroyGraph(GRAPH)
insertArc(ARC)
searchArc(ARC)
removeArc(ARC)
GRAPH copyGraph(GRAPH)
As funções podem mudar a depender da estrutura utilizada, e GRAPH
também pode ser denido de várias formas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 10 / 33
Sumário
1 Recordando
2 Estruturas de Dados
Lista de Arcos
Lista de Adjacência
Matriz de Adjacência
Matriz de Incidência
3 Desempenho assintótico
4 Estruturas alternativas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 11 / 33
Lista de Arcos
armazena cada arco presente no digrafo
considera que todo vértice possui ao menos uma conexão
implementação em lista ligada ou arranjo, cada elemento representa
um arco
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 12 / 33
Sumário
1 Recordando
2 Estruturas de Dados
Lista de Arcos
Lista de Adjacência
Matriz de Adjacência
Matriz de Incidência
3 Desempenho assintótico
4 Estruturas alternativas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 13 / 33
Lista de Adjacência
Especica todos os vértices adjacentes a cada vértice do grafo.
Implementações possíveis.
representação estrela: implementação em tabela (arranjo)
lista ligada de vértices com ponteiro para o início de uma lista de
adjacência (também uma lista ligada).
arranjo de vértices com ponteiro para o início de uma lista de
adjacência (lista ligada).
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 14 / 33
Lista de Adjacência: estrela e lista ligada
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 15 / 33
Lista de Adjacência
Questões importantes:
a implementação para um digrafo é um pouco diferente daquela para
um grafo.
se desejarmos que os vértices e arcos tenha um nome ou valor temos
que pensar numa estrutura para armazenar esses valores
a lista de adjacência é geralmente utilizada para a implementação de
grafos esparsos.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 16 / 33
Lista de Adjacência: uma proposta em C
// Um 'node' representa um elemento na lista de adjacencia
// e o tipo 'Link' e um ponteiro para a estrutura 'node'
typedef struct node *Link;
struct node {
Vertex w;
Link next;
};
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a lista de adjacencia
struct digraph {
int V;
int A;
Link *adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
Lista de Adjacência: uma proposta em C
// Um 'node' representa um elemento na lista de adjacencia
// e o tipo 'Link' e um ponteiro para a estrutura 'node'
typedef struct node *Link;
struct node {
Vertex w;
Link next;
};
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a lista de adjacencia
struct digraph {
int V;
int A;
Link *adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
Lista de Adjacência: uma proposta em C
// Um 'node' representa um elemento na lista de adjacencia
// e o tipo 'Link' e um ponteiro para a estrutura 'node'
typedef struct node *Link;
struct node {
Vertex w;
Link next;
};
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a lista de adjacencia
struct digraph {
int V;
int A;
Link *adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
Lista de Adjacência: uma proposta em C
// Um 'node' representa um elemento na lista de adjacencia
// e o tipo 'Link' e um ponteiro para a estrutura 'node'
typedef struct node *Link;
struct node {
Vertex w;
Link next;
};
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a lista de adjacencia
struct digraph {
int V;
int A;
Link *adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
Lista de Adjacência: uma proposta em C
// Um 'node' representa um elemento na lista de adjacencia
// e o tipo 'Link' e um ponteiro para a estrutura 'node'
typedef struct node *Link;
struct node {
Vertex w;
Link next;
};
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a lista de adjacencia
struct digraph {
int V;
int A;
Link *adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
Lista de Adjacência: arranjo de vértices e lista ligada de
adjacência  representação de digrafo
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 18 / 33
Lista de Adjacência: arranjo de vértices e lista ligada de
adjacência  representação de grafo
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 19 / 33
Sumário
1 Recordando
2 Estruturas de Dados
Lista de Arcos
Lista de Adjacência
Matriz de Adjacência
Matriz de Incidência
3 Desempenho assintótico
4 Estruturas alternativas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 20 / 33
Matriz de Adjacência
matriz binária de tamanho V(G) × V(G), tal que cada entrada
dij =

1, se existe A(vi , vj )
0, caso contrário.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 21 / 33
Matriz de Adjacência
matriz binária de tamanho V(G) × V(G), tal que cada entrada
dij =

1, se existe A(vi , vj )
0, caso contrário.
pode ser generalizada para multigrafos modicando a denição:
dij = número de arestas entre vi e vj
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 21 / 33
Matriz de Adjacência
matriz binária de tamanho V(G) × V(G), tal que cada entrada
dij =

1, se existe A(vi , vj )
0, caso contrário.
pode ser generalizada para multigrafos modicando a denição:
dij = número de arestas entre vi e vj
pode ser generalizada para incluir laços permitindo a inclusão de
valores na diagonal principal.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 21 / 33
Lista de Adjacência: uma proposta em C
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a matriz de adjacencia
// a matriz devera ser alocada dinamicamente
struct digraph {
int V;
int A;
int **adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 22 / 33
Lista de Adjacência: uma proposta em C
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a matriz de adjacencia
// a matriz devera ser alocada dinamicamente
struct digraph {
int V;
int A;
int **adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 22 / 33
Lista de Adjacência: uma proposta em C
// O digrafo armazena: o numero de vertices V, o numero de arcos A
// e um ponteiro para a matriz de adjacencia
// a matriz devera ser alocada dinamicamente
struct digraph {
int V;
int A;
int **adj;
};
// Digraph sera um ponteiro para a criacao de um digrafo
typedef struct digraph *Digraph;
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 22 / 33
Matriz de Adjacência: representação de digrafo
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 23 / 33
Matriz de Adjacência: representação de grafo
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 24 / 33
Sumário
1 Recordando
2 Estruturas de Dados
Lista de Arcos
Lista de Adjacência
Matriz de Adjacência
Matriz de Incidência
3 Desempenho assintótico
4 Estruturas alternativas
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 25 / 33
Matriz de Incidência
baseada na incidência de vértices e arestas, é uma matriz de tamanho
V(G) × A(G), tal que cada entrada
cij =

1, se a aresta aj é incidente com o vértice vi
0, caso contrário.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 26 / 33
Matriz de Indicência: representação de digrafo
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 27 / 33
Matriz de Indicência: representação de grafo
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 28 / 33
Desempenho assintótico
Considerando um digrafo simples de n vértices e m arestas.
Pela notação O():
Lista de
Arcos
Lista de
Adjacência
Matriz de
Adjacência
Espaço n + m n + m n2 + m
Vericar arcos incidentes m grau(v) n
Vericar adjacência m grau(v) 1
Inserir vértice 1 1 n2
Inserir arco 1 1 1
Remover vértice m grau(v) n2
Remover arco 1 1 1
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 29 / 33
Estruturas alternativas às sugeridas
Montar uma lista de arcos e uma lista de vértices
Cada elemento arco aponta para um par de elementos vértice
Separadamente, gerar e manipular uma lista ou matriz de adjacência
Cada elemento da lista ou matriz aponta para o arco correspondente
àquela informação de adjacência, ou contém nulo se não houver
conexão.
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 30 / 33
Bibliograa I
SEDGEWICK, R.
Algorithms in C: part 5, 3.ed., Addison-Wesley, 2002.
Graph ADTAdjacency-Lists Representation (Seções 17.2, 17.3 e
17.4)
ZIVIANI, N.
Projeto de Algoritmos, 3.ed. Cengage, 2004.
(Capítulo 7)
TENEMBAUM, A.M. et al.
Estruturas de Dados Usando C. Pearson Makron, 1995.
Grafos e suas aplicações (Capítulo 8).
CORMEN, T. H. et al.
Algoritmos: teoria e prática. Campus-Elsevier, 2002.
Algoritmos de Grafos (parte IV).
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 31 / 33
Bibliograa II
KNUTH, D.
The Art of Computer Programming: fundamental algorithms, v.1.
Addison-Wesley, 1969.
Basic Mathematical Properties of Trees (Seção 2.3.4)
FEOFILOFF, P.
Estruturas de Dados.
http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/
digraphdatastructs.html
FEOFILOFF, P.
Listas de adjacência.
http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/adjlists.html
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 32 / 33
Bibliograa III
FEOFILOFF, P.
Matrizes de adjacência.
http:
//www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/adjmatrix.html
Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 33 / 33

Mais conteúdo relacionado

Destaque

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Alg2_02.Grafos_ED na programacao geral.pdf

  • 1. 02 Grafos: estruturas de dados SCC0503 Algoritmos e Estruturas de Dados II Prof. Moacir Ponti Jr. www.icmc.usp.br/~moacir Instituto de Ciências Matemáticas e de Computação USP 2011/1 Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 1 / 33
  • 2. Sumário 1 Recordando 2 Estruturas de Dados Lista de Arcos Lista de Adjacência Matriz de Adjacência Matriz de Incidência 3 Desempenho assintótico 4 Estruturas alternativas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 2 / 33
  • 3. Digrafos Directed graph, ou digrafo é um conjunto de vértices e um conjunto de arcos Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 3 / 33
  • 4. Arcos e Vértices Um arco, é um par ordenado de vértices Exemplo: v e w são vértices e v-w é um arco. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 4 / 33
  • 5. Examinando um arco O primeiro vértice do par ordenado é a ponta inicial do arco, e o segundo a ponta nal. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 5 / 33
  • 6. Conceitos Básicos Um grafo G = (V, E) é composto de: V: conjunto de vértices E: conjunto de arestas Se α = {v, w} é uma aresta de um grafo, dizemos que α liga os vértices v e w, ou que incide em v (e em w). V = {a, b, c, d, e} E = {(a, b), (a, c), (a, d), (b, e), (c, d), (c, e), (d, e)} Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 6 / 33
  • 7. Adjacência e Grau Vértices adjacentes: vértices conectados por uma aresta. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
  • 8. Adjacência e Grau Vértices adjacentes: vértices conectados por uma aresta. Grau de um vértice: número de vértices adjacentes Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
  • 9. Adjacência e Grau Vértices adjacentes: vértices conectados por uma aresta. Grau de um vértice: número de vértices adjacentes Qual a soma dos graus de todos os vértices? Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
  • 10. Adjacência e Grau Vértices adjacentes: vértices conectados por uma aresta. Grau de um vértice: número de vértices adjacentes Qual a soma dos graus de todos os vértices? O dobro de números de arestas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 7 / 33
  • 11. Estruturas de Dados Existem vários meios para se representar um grafo. Três estruturas são mais comuns: Lista de Arcos Lista de Adjacência Matriz de Adjacência Matriz de Incidência Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 8 / 33
  • 12. Estruturas de Dados: uma proposta em C // Os vértices (0,1,..,V-1) são representados por um tipo Vertex. #define Vertex int // Uma estrutura do tipo ARC representa um arco // com ponta inicial v e ponta final w. typedef struct { Vertex v; Vertex w; } ARC; // A função Arc recebe dois vértices v, w e devolve // um arco com ponta inicial v e ponta final w. ARC Arc (Vertex v, Vertex w) { ARC e; e.v = v; e.w = w; return e; } Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
  • 13. Estruturas de Dados: uma proposta em C // Os vértices (0,1,..,V-1) são representados por um tipo Vertex. #define Vertex int // Uma estrutura do tipo ARC representa um arco // com ponta inicial v e ponta final w. typedef struct { Vertex v; Vertex w; } ARC; // A função Arc recebe dois vértices v, w e devolve // um arco com ponta inicial v e ponta final w. ARC Arc (Vertex v, Vertex w) { ARC e; e.v = v; e.w = w; return e; } Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
  • 14. Estruturas de Dados: uma proposta em C // Os vértices (0,1,..,V-1) são representados por um tipo Vertex. #define Vertex int // Uma estrutura do tipo ARC representa um arco // com ponta inicial v e ponta final w. typedef struct { Vertex v; Vertex w; } ARC; // A função Arc recebe dois vértices v, w e devolve // um arco com ponta inicial v e ponta final w. ARC Arc (Vertex v, Vertex w) { ARC e; e.v = v; e.w = w; return e; } Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
  • 15. Estruturas de Dados: uma proposta em C // Os vértices (0,1,..,V-1) são representados por um tipo Vertex. #define Vertex int // Uma estrutura do tipo ARC representa um arco // com ponta inicial v e ponta final w. typedef struct { Vertex v; Vertex w; } ARC; // A função Arc recebe dois vértices v, w e devolve // um arco com ponta inicial v e ponta final w. ARC Arc (Vertex v, Vertex w) { ARC e; e.v = v; e.w = w; return e; } Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 9 / 33
  • 16. Estruturas de Dados: TAD digrafo Um TAD digrafo deve fornecer algumas funções, por exemplo: GRAPH initGraph(int) destroyGraph(GRAPH) insertArc(ARC) searchArc(ARC) removeArc(ARC) GRAPH copyGraph(GRAPH) Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 10 / 33
  • 17. Estruturas de Dados: TAD digrafo Um TAD digrafo deve fornecer algumas funções, por exemplo: GRAPH initGraph(int) destroyGraph(GRAPH) insertArc(ARC) searchArc(ARC) removeArc(ARC) GRAPH copyGraph(GRAPH) As funções podem mudar a depender da estrutura utilizada, e GRAPH também pode ser denido de várias formas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 10 / 33
  • 18. Sumário 1 Recordando 2 Estruturas de Dados Lista de Arcos Lista de Adjacência Matriz de Adjacência Matriz de Incidência 3 Desempenho assintótico 4 Estruturas alternativas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 11 / 33
  • 19. Lista de Arcos armazena cada arco presente no digrafo considera que todo vértice possui ao menos uma conexão implementação em lista ligada ou arranjo, cada elemento representa um arco Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 12 / 33
  • 20. Sumário 1 Recordando 2 Estruturas de Dados Lista de Arcos Lista de Adjacência Matriz de Adjacência Matriz de Incidência 3 Desempenho assintótico 4 Estruturas alternativas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 13 / 33
  • 21. Lista de Adjacência Especica todos os vértices adjacentes a cada vértice do grafo. Implementações possíveis. representação estrela: implementação em tabela (arranjo) lista ligada de vértices com ponteiro para o início de uma lista de adjacência (também uma lista ligada). arranjo de vértices com ponteiro para o início de uma lista de adjacência (lista ligada). Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 14 / 33
  • 22. Lista de Adjacência: estrela e lista ligada Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 15 / 33
  • 23. Lista de Adjacência Questões importantes: a implementação para um digrafo é um pouco diferente daquela para um grafo. se desejarmos que os vértices e arcos tenha um nome ou valor temos que pensar numa estrutura para armazenar esses valores a lista de adjacência é geralmente utilizada para a implementação de grafos esparsos. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 16 / 33
  • 24. Lista de Adjacência: uma proposta em C // Um 'node' representa um elemento na lista de adjacencia // e o tipo 'Link' e um ponteiro para a estrutura 'node' typedef struct node *Link; struct node { Vertex w; Link next; }; // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a lista de adjacencia struct digraph { int V; int A; Link *adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
  • 25. Lista de Adjacência: uma proposta em C // Um 'node' representa um elemento na lista de adjacencia // e o tipo 'Link' e um ponteiro para a estrutura 'node' typedef struct node *Link; struct node { Vertex w; Link next; }; // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a lista de adjacencia struct digraph { int V; int A; Link *adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
  • 26. Lista de Adjacência: uma proposta em C // Um 'node' representa um elemento na lista de adjacencia // e o tipo 'Link' e um ponteiro para a estrutura 'node' typedef struct node *Link; struct node { Vertex w; Link next; }; // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a lista de adjacencia struct digraph { int V; int A; Link *adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
  • 27. Lista de Adjacência: uma proposta em C // Um 'node' representa um elemento na lista de adjacencia // e o tipo 'Link' e um ponteiro para a estrutura 'node' typedef struct node *Link; struct node { Vertex w; Link next; }; // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a lista de adjacencia struct digraph { int V; int A; Link *adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
  • 28. Lista de Adjacência: uma proposta em C // Um 'node' representa um elemento na lista de adjacencia // e o tipo 'Link' e um ponteiro para a estrutura 'node' typedef struct node *Link; struct node { Vertex w; Link next; }; // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a lista de adjacencia struct digraph { int V; int A; Link *adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 17 / 33
  • 29. Lista de Adjacência: arranjo de vértices e lista ligada de adjacência representação de digrafo Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 18 / 33
  • 30. Lista de Adjacência: arranjo de vértices e lista ligada de adjacência representação de grafo Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 19 / 33
  • 31. Sumário 1 Recordando 2 Estruturas de Dados Lista de Arcos Lista de Adjacência Matriz de Adjacência Matriz de Incidência 3 Desempenho assintótico 4 Estruturas alternativas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 20 / 33
  • 32. Matriz de Adjacência matriz binária de tamanho V(G) × V(G), tal que cada entrada dij = 1, se existe A(vi , vj ) 0, caso contrário. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 21 / 33
  • 33. Matriz de Adjacência matriz binária de tamanho V(G) × V(G), tal que cada entrada dij = 1, se existe A(vi , vj ) 0, caso contrário. pode ser generalizada para multigrafos modicando a denição: dij = número de arestas entre vi e vj Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 21 / 33
  • 34. Matriz de Adjacência matriz binária de tamanho V(G) × V(G), tal que cada entrada dij = 1, se existe A(vi , vj ) 0, caso contrário. pode ser generalizada para multigrafos modicando a denição: dij = número de arestas entre vi e vj pode ser generalizada para incluir laços permitindo a inclusão de valores na diagonal principal. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 21 / 33
  • 35. Lista de Adjacência: uma proposta em C // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a matriz de adjacencia // a matriz devera ser alocada dinamicamente struct digraph { int V; int A; int **adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 22 / 33
  • 36. Lista de Adjacência: uma proposta em C // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a matriz de adjacencia // a matriz devera ser alocada dinamicamente struct digraph { int V; int A; int **adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 22 / 33
  • 37. Lista de Adjacência: uma proposta em C // O digrafo armazena: o numero de vertices V, o numero de arcos A // e um ponteiro para a matriz de adjacencia // a matriz devera ser alocada dinamicamente struct digraph { int V; int A; int **adj; }; // Digraph sera um ponteiro para a criacao de um digrafo typedef struct digraph *Digraph; Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 22 / 33
  • 38. Matriz de Adjacência: representação de digrafo Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 23 / 33
  • 39. Matriz de Adjacência: representação de grafo Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 24 / 33
  • 40. Sumário 1 Recordando 2 Estruturas de Dados Lista de Arcos Lista de Adjacência Matriz de Adjacência Matriz de Incidência 3 Desempenho assintótico 4 Estruturas alternativas Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 25 / 33
  • 41. Matriz de Incidência baseada na incidência de vértices e arestas, é uma matriz de tamanho V(G) × A(G), tal que cada entrada cij = 1, se a aresta aj é incidente com o vértice vi 0, caso contrário. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 26 / 33
  • 42. Matriz de Indicência: representação de digrafo Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 27 / 33
  • 43. Matriz de Indicência: representação de grafo Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 28 / 33
  • 44. Desempenho assintótico Considerando um digrafo simples de n vértices e m arestas. Pela notação O(): Lista de Arcos Lista de Adjacência Matriz de Adjacência Espaço n + m n + m n2 + m Vericar arcos incidentes m grau(v) n Vericar adjacência m grau(v) 1 Inserir vértice 1 1 n2 Inserir arco 1 1 1 Remover vértice m grau(v) n2 Remover arco 1 1 1 Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 29 / 33
  • 45. Estruturas alternativas às sugeridas Montar uma lista de arcos e uma lista de vértices Cada elemento arco aponta para um par de elementos vértice Separadamente, gerar e manipular uma lista ou matriz de adjacência Cada elemento da lista ou matriz aponta para o arco correspondente àquela informação de adjacência, ou contém nulo se não houver conexão. Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 30 / 33
  • 46. Bibliograa I SEDGEWICK, R. Algorithms in C: part 5, 3.ed., Addison-Wesley, 2002. Graph ADTAdjacency-Lists Representation (Seções 17.2, 17.3 e 17.4) ZIVIANI, N. Projeto de Algoritmos, 3.ed. Cengage, 2004. (Capítulo 7) TENEMBAUM, A.M. et al. Estruturas de Dados Usando C. Pearson Makron, 1995. Grafos e suas aplicações (Capítulo 8). CORMEN, T. H. et al. Algoritmos: teoria e prática. Campus-Elsevier, 2002. Algoritmos de Grafos (parte IV). Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 31 / 33
  • 47. Bibliograa II KNUTH, D. The Art of Computer Programming: fundamental algorithms, v.1. Addison-Wesley, 1969. Basic Mathematical Properties of Trees (Seção 2.3.4) FEOFILOFF, P. Estruturas de Dados. http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/ digraphdatastructs.html FEOFILOFF, P. Listas de adjacência. http://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/adjlists.html Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 32 / 33
  • 48. Bibliograa III FEOFILOFF, P. Matrizes de adjacência. http: //www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/adjmatrix.html Moacir Ponti Jr. (ICMCUSP) 02 Grafos: parte 2 2011/1 33 / 33