Sunteți pe pagina 1din 15

(http://www.tocadoelfo.com.

br/)

PromooDiaConsumidor
20%DescontoCursoseMdulosCursosJAVA,CertificaoSCJP

Grafos e Python, uma histria de sucesso!


sexta-feira, 13 de maio de 2011, 19:16
Marcadores:

Grafos

Eduardo Rolim

5 Comentrios

(http://www.tocadoelfo.com.br/search/label/Grafos),

(http://www.tocadoelfo.com.br/search/label/Matem%C3%A1tica),

Matemtica
Python

(http://www.tocadoelfo.com.br/search/label/Python)

(http://4.bp.blogspot.com/--

t3aoLicYnM/Tc2qgjwXZ6I/AAAAAAAAFpI/mH6s5p4_3nA/s1600/6n-graf.png)
Me diga a: quem nunca mexeu com grafos na vida? Com certeza, muitas pessoas respondero que
nunca mexeram, outras que j mexeram e a grande maioria vai digitar no Google perguntar o que um
grafo.
Bem, explicar o que um grafo simples! Grafo uma estrutura G(V,A) onde V um conjunto no
vazio de objetos denominados vrtices e A um conjunto de pares no ordenados de V, chamado
arestas.
Hehe, boiou n? Bem, o seguinte. Um grafo nada mais do que um monte de bolinhas (vrtices)
que podem ou no estar ligados outras bolinhas atravs de linhas(arestas). Simples idia, no ? Eu

sempre me surprefimi com a capacidade que alguns professores de estruturas de dados tm de tornar
a percepo de grafos mais complexa do que ela realmente deve ser. Bom, a idia essa: um monte
de bolinhas que podem ser ligadas por linhas.
Mas, por que os professores de estruturas de dados falam tanto nesse tal de grafo? Bom, porque esta
estrutura simples permite voc resolver vrios tipos de problemas diferentes. No caso as bolinhas e as
linhas, que a partir de agora chamarei de vrtices e arestas, podem armazenar informaes de acordo
com o que o grafo pode estar representando...

(http://3.bp.blogspot.com/Q2z1H6tsKbs/Tc2qhOJD_sI/AAAAAAAAFpM/JOQFtF3o3no/s1600/redes2.gif)
E o que o grafo pode representar, hein? Vejo que provavelmente voc nunca desenhou nada na sua
vida, n? Grafos podem representar, por exemplo, um mapa de estradas, onde cada cidade um
vrtice, enquanto as estradas as arestas. Outro exemplo, aplicado computao, a internet. O
conceito de redes interconectadas tambm pode ser representada como um grafo, onde cada rede
um vrtice e as conexes entre as redes so as arestas.

(http://4.bp.blogspot.com/-

J0Gr9KxW5Ig/Tc2sEMYT2gI/AAAAAAAAFpY/VWhcg0NvsnY/s1600/Captura_de_tela.png)
Os grafos foram inventados por Euler em 1736 para resolver o famoso problema das pontes de
Knigsberg (http://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg). A questo era saber
se era possvel atravessar as sete pontes do rio Pregel, passando sobre cada uma delas uma s vez, e
regressar ao ponto de partida. A ideia de Euler consistiu em representar as quatro zonas da cidade,
delimitadas pelo rio, por vrtices e as pontes por arestas entre esses vrtices. O objeto assim
construdo um exemplo de um grafo.
Pensando neste modelo, evidente que um tal caminho s possvel se cada vrtice estiver ligado a
um nmero par de arestas, pois se se chega a uma zona por uma ponte, a condio "cada ponte
percorrida uma s vez" implica que se possa sair por outra. Dado que todos os vrtices do grafo tm
grau (nmero de arestas que saem de um nodo) mpar, um caminho com aquelas propriedades
impossvel.
Agora, por que estou falando de grafos? Porque estou querendo falar de Python...
Subindo um pouco o nvel da abstrao, grafos so redes constitudas por vrtices, conectados por
arestas. Existem dois tipos de grafos: grafos dirigidos e grafos no dirigidos. Em grafos dirigidos, as
arestas tm uma direo definida (de um vrtice para outro) e neste caso podem ser chamadas de
arcos. No caso dos grafos no dirigidos, no h uma direo definida para as arestas e as mesmas
podem ser percorridas em qualquer direo.
Algoritmos para grafos incluem, entre outros, problemas de roteamento como procurar caminhos que
alcancem

todas

as

arestas

(problema

do

caixeiro

viajante

(http://pt.wikipedia.org/wiki/Problema_do_caixeiro_viajante)) ou encontrar o menor caminho entre dois


ns

(problema

do

menor

caminho

(http://pt.wikipedia.org/wiki/Problema_do_caminho_m%C3%ADnimo)) e problemas de fluxos de redes


(teorema

do

fluxo

mximo

(http://pt.wikipedia.org/wiki/Teorema_do_Fluxo_M%C3%A1ximo%E2%80%93Corte_M%C3%ADnimo)).

(http://4.bp.blogspot.com/-

As1mvEgzR6U/Tc2rrTZX-0I/AAAAAAAAFpU/fhGc0iBZBpI/s1600/NetworkTopologies.png)
H considervel literatura sobre grafos, que so uma parte bastante importante da matemtica
discreta. Grafos tm tambm uma grande utilidade prtica em alguns tipos de algoritmos,
principalmente quando so usados grafos acclicos (comumente chamados de rvores). Outro exemplo
de uso de grafos na anlise de fluxo de algoritmos, j que um cdigo pode ser interpretado sob a
forma de um grafo e com isso pode-se perceber os fluxos que indicam laos de deciso, recurso e
at mesmo podem permitir identificar cdigo que nunca seria executado.
Grafos e Python
Poucas linguagens de programao oferecem suporte direto grafos como um tipo de dado, e o
Python no e exceo. No entanto, ao contrrio da grande maioria das outras linguagens de
programao, relativamente simples se construir grafos em Python, usando-se listas e dicionrios.
Como exemplo, peguemos a imagem do incio do post. partir dele, podemos encontrar as seguintes
relaes:
1 -- 2
1 -- 5
2 -- 1
2 -- 3
2 -- 5
3 -- 2
3 -- 4
4 -- 3
4 -- 5
4 -- 6
5 -- 1
5 -- 2

5 -- 4
6 -- 4

Aqui, listamos cada uma das ligaes entre os vrtices, numeradas de 1 a 6. Voc deve ter notado que
algumas relaes se repetem (como por exemplo 1 -- 2 e 2 -- 1). Neste caso, estamos querfimo
implementar um grafo no dirigido. Como o mesmo permite associaes bidirecionais entre os
vrtices, as duas relaes so necessrias para fazer funcionar nosso exemplo usando listas e
dicionrios. Da, agora que extramos as relaes entre vrtices (as arestas, duh) vamos montar nosso
grafo:

grafo={
'1':['2','5'],
'2':['1','3','5'],
'3':['2','4'],
'4':['3','5','6'],
'5':['1','2','4'],
'6':['4']
}

Como voc pode perceber, o nosso grafo est representado em um dicionrio cujos elementos-chave
so os vrtices. Para cada vrtice, est associada uma lista que contm todas as arestas com as quais
a mesma est relacionada. O exemplo bastante simples e pode no ter uma utilidade muito prtica,
mas serve para mostrar como pode ser simples criar um grafo em Python. Se voc j usou dicionrios
de forma um pouco mais avanada, j percebeu que pode utilizar outros objetos como elementoschave em um dicionrio. O importante, no caso, que o objeto seja imutvel. Desta forma, voc pode
facilmente adicionar informaes aos vrtices (e porque no, nas arestas).
Usando funes com grafos
Agora que criamos nosso grafo usando um dicionrio e listas, como podemos tornar esse grafo til?
Rodando algum algoritmo construdo para grafos! Para nosso exemplo, vamos construir uma funo
que determine um caminho entre dois vrtices quaisquer. Este algoritmo pega um grafo dado e dois
vrtices como argumentos. Ele ir retornar a lista de vrtices (incluindo os vrtices de incio e fim) que
corresponde ao caminho. Caso no haja nenhum caminho entre os dois vrtices, a funo retornar
None.

defencontra_caminho(grafo,inicio,fim,caminho=None):
ifcaminhoisNone:caminho=[]
caminho+=[inicio]
ifinicio==fim:
returncaminho
ifnotinicioingrafo:
returnNone

forarestaingrafo[inicio]:
ifarestanotincaminho:
novo_caminho=encontra_caminho(grafo,aresta,fim,caminho)
ifnovo_caminho:returnnovo_caminho
returnNone

Vamos testar com o nosso grafo:


>>> encontra_caminho(grafo, '1', '6')
['1', '2', '3', '4', '5', '6']
>>> encontra_caminho(grafo, '6', '1')
['6', '4', '3', '2', '1']
>>> encontra_caminho(grafo, '5', '3')
['5', '1', '2', '3']

Voc pode ver que nosso cdigo no dos mais inteligentes. No entanto ele sempre encontrar uma
rota neste grafo, pois o mesmo no dirigido. Vamos agora usar um grafo dirigido (tambm chamado
de dgrafo) em nosso exemplo:

digrafo={
'A':['B','C'],
'B':['C','D'],
'C':['D'],
'D':['C'],
'E':['F'],
'F':['C']
}

E ao executar nosso cdigo neste grafo, temos:


>>> encontra_caminho(digrafo, 'A', 'D')
['A', 'B', 'C', 'D']
>>> encontra_caminho(digrafo, 'D', 'A')
None

Note que na nossa funo, quando a chamamos com trs argumentos, um quarto argumento
adicionado funo, que na verdade usado pela prpria funo para evitar que a funo evite ciclos
(testado no primeiro if dentro do for). Por padro este argumento vazio, pois ainda no percorremos
o grafo. Outra coisa: voc deve ter notado que eu usei caminho += [inicio] ao invs de usar
caminho.append(inicio). A primeira linha de cdigo ir criar uma nova lista, ao passo de que a segunda
linha ir somente adicionar o vrtice dentro da lista. Usar a segunda linha no funcionaria, pois a

varivel caminho seria alterada dentro da funo (e ns chamamos a funo recursivamente) e isto
poderia ter resultados imprevisveis.
Outra coisa sobre nossa funo: ela s mostra um nico caminho. Isso porque a funo s verifica se
existe um caminho entre dois vrtices. Ele no procura todos os caminhos nem mesmo procura pelo
menor caminho entre os vrtices. Vamos ento, alterar a funo de forma a fazer isto. Primeiro, vamos
listar todos os caminhos:

defencontra_todos_caminhos(grafo,inicio,fim,caminho=[]):
caminho=caminho+[inicio]
ifinicio==fim:
return[caminho]
ifnotinicioingrafo:
return[]
caminhos=[]
forverticeingrafo[inicio]:
ifverticenotincaminho:
novos_caminhos=encontra_todos_caminhos(grafo,vertice,fim,caminho)
fornovo_caminhoinnovos_caminhos:
caminhos.append(novo_caminho)
returncaminhos

Executando este cdigo contra os grafos j criados temos, por exemplo:


>>> encontra_todos_caminhos(grafo, '1', '6')
[['1', '2', '3', '4', '6'], ['1', '2', '5', '4', '6'], ['1', '5', '2', '3', '4', '6'], ['1', '5', '4', '6']]
>>> encontra_todos_caminhos(digrafo, 'A', 'D')
[['A', 'B', 'C', 'D'], ['A', 'B', 'D'], ['A', 'C', 'D']]

Como voc viu, ele retornou todos os possveis caminhos entre dois vrtices dentro de um grafo, sem
que o mesmo entrasse em um looping. Agora, qual destes o caminho mais curto? Para isso, vamos
mudar um pouco mais nossa funo:

defencontra_caminho_maiscurto(grafo,inicio,fim,caminho=[]):
caminho=caminho+[inicio]
ifinicio==fim:
returncaminho
ifnotinicioingrafo:
returnNone
maiscurto=None
forverticeingrafo[inicio]:
ifverticenotincaminho:
novo_caminho=encontra_caminho_maiscurto(grafo,vertice,fim,caminho)
ifnovo_caminho:
ifnotmaiscurtoorlen(novo_caminho)<len(maiscurto):
maiscurto=novo_caminho

returnmaiscurto

E novamente, executando contra os grafos:


>>> encontra_caminho_maiscurto(grafo, '1', '6')
['1', '5', '4', '6']
>>> encontra_caminho_maiscurto(digrafo, 'A', 'D')
['A', 'B', 'D']

Como voc pode ver, criar grafos em Python no uma tarefa difcil. No entanto, dependendo do que
voc for construir, construir um grafo usando dicionrio pode ser uma tarefa um tanto complexa.
Nesse caso, voc pode simplesmente criar uma classe que represente um grafo. Claro que isto no
ser to eficiente quanto a soluo acima (que est prxima da soluo tima) mas voc adicionar um
nvel de abstrao maior ao lidar com grafos mais complexos.
Para finalizar, eu criei uma classe para representar um grafo em Python. Tudo o que ele faz ocultar a
estrutura de grafos que criamos acima. Os mtodos do objeto foram extrados do artigo sobre Grafos
(http://en.wikipedia.org/wiki/Graph_(data_structure)), na Wikipdia. Segue a o cdigo:

classGrafo:
def__init__(self):
self.lista_vizinhos={}
self.lista_vertices={}

defadd_vertice(self,vertice):
self.lista_vertices[vertice]=True

defadd_aresta(self,vertice,outro_vertice):
ifnotverticeinself.lista_vizinhos:
self.lista_vizinhos[vertice]=[]
self.lista_vizinhos[vertice].append(outro_vertice)
ifnotoutro_verticeinself.lista_vizinhos:
self.lista_vizinhos[outro_vertice]=[]
self.lista_vizinhos[outro_vertice].append(vertice)

defvizinhos(self,vertice):
ifverticeinself.lista_vizinhos:
returnself.lista_vizinhos[vertice]
else:
return[]

defvertices(self):
returnself.lista_vertices.keys()

defdeleta_aresta(self,vertice,outro_vertice):
self.vizinhos(vertice).remove(outro_vertice)
self.vizinhos(outro_vertice).remove(vertice)


defdeleta_vertice(self,vertice):
foroutro_verticeinself.lista_vizinhos[vertice]:
self.deleta_aresta(vertice,outro_vertice)
delself.lista_vizinhos[vertice]
delself.lista_vertices[vertice]

if__name__=="__main__":
G=Grafo()
G.add_vertice(1)
G.add_vertice(2)
G.add_vertice(3)
G.add_vertice(4)
G.add_aresta(1,2)
G.add_aresta(1,3)
G.add_aresta(3,4)
print(G.vizinhos(1))

Bem, isso! Espero que tenham gostado da pequena aula de grafos. Nas fontes, voc encontrar
muito mais material sobre o assunto! At o prximo post!
Fontes:
http://www.ime.usp.br/~pf/teoriadosgrafos/texto/TeoriaDosGrafos.pdf
(http://www.ime.usp.br/~pf/teoriadosgrafos/texto/TeoriaDosGrafos.pdf)
http://complexu.wordpress.com/2008/08/13/desenhar-e-converter-grafos-em-python/
(http://complexu.wordpress.com/2008/08/13/desenhar-e-converter-grafos-em-python/)
http://wiki.python.org/moin/PythongrafoApi (http://wiki.python.org/moin/PythongrafoApi)
http://www.python.org/doc/essays/graphs/ (http://www.python.org/doc/essays/graphs/)
http://code.activestate.com/recipes/466329-graph/ (http://code.activestate.com/recipes/466329-graph/)

Eduardo Rolim

Compartilhe!

(http://www.facebook.com/sharer.php?u=http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeucom-grafos.html&title=Grafos e Python, uma histria de sucesso!)

(http://twitter.com/share?url=http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html&title=Grafos e Python, uma histria de sucesso!)

(https://plus.google.com/u/0/share?url=http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-com-

grafos.html)

(http://reddit.com/submit?&url=http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html&title=Grafos e Python, uma histria de sucesso!)

(http://del.icio.us/post?url=http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html&title=Grafos e Python, uma histria de sucesso!)

5 comentrios:

Astronauta Z
(http://www.blogger.com/profile/16179298640382382311) 28 de julho de 2011
23:15 (http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html?showComment=1311905727788#c3775957067153568715)

Bah! Muito bom o seu post.


S fiquei com uma dvida: possvel adicionar um valor s arestas (as quais, no seu exemplo,
possuem todas um mesmo valor)? Como poderia implementar para buscar o menor caminho
nesta abordagem?
Abrao.
Ricardo
Responder

Eduardo Rolim
(http://www.blogger.com/profile/16632544057688346807) 29 de julho de 2011
12:18 (http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html?showComment=1311952710525#c2814687425648727736)

Exato, no meu exemplo todas as arestas tm o mesmo tamanho. No implementei por


questes de simplicidade (preguia) mas no seria difcil.
Primeiramente, voc precisaria alterar o mtodo add_aresta para adicionar a informao de
tamanho e precisaria alterar a forma como as informaes de aresta esto armazenadas.
Neste
ltimo
exemplo,
eu
poderia
substituir
esse
cdigo:
self.lista_vizinhos[vertice].append(outro_vertice)
por
algo
assim:
self.lista_vizinhos[vertice].append({outro_vertice: valor}) onde voc adicionaria um dicionrio
com o outro vrtice sendo a chave e o tamanho sendo o atributo.
Esta seria a alterao mais profunda. Outras partes do cdigo tambm precisariam ser
alteradas para que a classe funcionasse normalmente, mas eu acho que voc deve ter captado
a idia hehehe!
Responder

Unknown (http://www.blogger.com/profile/04588733337282968634) 9 de

abril de 2012 03:08 (http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeucom-grafos.html?showComment=1333951730940#c797725282476183236)

Python consegue fazer grafo ficar fcil.


Parabns.
Responder

RICARDO SANTOS DE FRANA


(http://www.blogger.com/profile/07778785817054733610) 14 de abril de 2013
21:37 (http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html?showComment=1365986269979#c4454241896297726752)
Testei os cdigos porem tem dado erro de sintase.
Qual a verso que voc rodou esses grafos?
Responder

Eduardo Rolim
(http://www.blogger.com/profile/16632544057688346807) 15 de abril de 2013
14:15 (http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quem-nunca-mexeu-comgrafos.html?showComment=1366046142616#c2051395292093353838)
poca que esse cdigo foi feito, ainda usava o Python 2.6.
Estou providenciando a adequao do cdigo para a verso current do ramo 3.0.
Responder

Digiteseucomentrio...

Comentarcomo:

Publicar

ContadoGoogle

Visualizar

Todos os comentrios sero moderados (lidos e avaliados) antes de serem postados. No sero tolerados
comentrios que:
- Contenham ofensas pessoais ou difamao contra qualquer pessoa ou marca.
- Declarem ou incentivem o racismo ou qualquer tipo de preconceito.
- Possuam links de comrcio eletrnico, contedo adulto ou divulgao de qualquer site.
Sua opinio sempre bem vinda e dvidas sero esclarecidas na medida do possvel. :)
(https://www.blogger.com/comment-iframe.g?
blogID=22848306&postID=3928045662514097133&blogspotRpcToken=61646)

Postagem mais recente (http://www.tocadoelfo.com.br/2011/05/dica-recuperando-videos-excluidosno.html)

Pgina
inicial

(http://www.tocadoelfo.com.br/)
Postagem mais antiga (http://www.tocadoelfo.com.br/2011/05/usando-wget-para-baixar-arquivos.html)

GlobalcodeAcademiaJava
OcursomaiscompletodeJavaComdescontodeat25%

Search...

Pesquisar

JONATAS BERMUDES
DE SIGN ER G R F IC O

Uma pessoa normal, assim como voc (ou no). Amo minha esposa Bia. Curto anime, mang, RPG e games
sangrentos. Escrevo histrias. Escuto apenas OSTs. Adoro desenhar... Mas no fim das contas, depende do que
voc entende por Normal.

(https://www.facebook.com/JonatasBermudes)
(https://twitter.com/jonatasbermudes)
(https://plus.google.com/u/0/117672948711989017748)
(http://instagram.com/jonatasbermudes)

R$34,90

R$119,90

R$229,90

R$179,90

R$99,90

R$272,90

ARQUIVO DO BLOG

2015 (http://www.tocadoelfo.com.br/search?updated-min=2015-01-01T00:00:00-02:00&updated-max=201601-01T00:00:00-02:00&max-results=1) (1)


2014 (http://www.tocadoelfo.com.br/search?updated-min=2014-01-01T00:00:00-02:00&updated-max=201501-01T00:00:00-02:00&max-results=18) (18)
2013 (http://www.tocadoelfo.com.br/search?updated-min=2013-01-01T00:00:00-02:00&updated-max=2014-

01-01T00:00:00-02:00&max-results=32) (32)
2012 (http://www.tocadoelfo.com.br/search?updated-min=2012-01-01T00:00:00-02:00&updated-max=201301-01T00:00:00-02:00&max-results=50) (74)
2011 (http://www.tocadoelfo.com.br/search?updated-min=2011-01-01T00:00:00-02:00&updated-max=201201-01T00:00:00-02:00&max-results=50) (60)
Dezembro (http://www.tocadoelfo.com.br/2011_12_01_archive.html) (8)
Novembro (http://www.tocadoelfo.com.br/2011_11_01_archive.html) (4)
Outubro (http://www.tocadoelfo.com.br/2011_10_01_archive.html) (6)
Setembro (http://www.tocadoelfo.com.br/2011_09_01_archive.html) (7)
Agosto (http://www.tocadoelfo.com.br/2011_08_01_archive.html) (4)
Julho (http://www.tocadoelfo.com.br/2011_07_01_archive.html) (5)
Junho (http://www.tocadoelfo.com.br/2011_06_01_archive.html) (4)
Maio (http://www.tocadoelfo.com.br/2011_05_01_archive.html) (5)
Dia da Toalha e do Orgulho Nerd (http://www.tocadoelfo.com.br/2011/05/dia-da-toalha-e-do-orgulhonerd.html)
Fisl 12 t chegando! (http://www.tocadoelfo.com.br/2011/05/fisl-12-ta-chegando.html)
[DICA]: Recuperando vdeos excludos no Youtube (http://www.tocadoelfo.com.br/2011/05/dicarecuperando-videos-excluidos-no.html)
Grafos e Python, uma histria de sucesso! (http://www.tocadoelfo.com.br/2011/05/me-diga-ai-quemnunca-mexeu-com-grafos.html)
Usando Wget para baixar arquivos protegidos contra...
(http://www.tocadoelfo.com.br/2011/05/usando-wget-para-baixar-arquivos.html)

Abril (http://www.tocadoelfo.com.br/2011_04_01_archive.html) (5)


Maro (http://www.tocadoelfo.com.br/2011_03_01_archive.html) (5)
Fevereiro (http://www.tocadoelfo.com.br/2011_02_01_archive.html) (4)
Janeiro (http://www.tocadoelfo.com.br/2011_01_01_archive.html) (3)

2010 (http://www.tocadoelfo.com.br/search?updated-min=2010-01-01T00:00:00-02:00&updated-max=201101-01T00:00:00-02:00&max-results=50) (66)


2009 (http://www.tocadoelfo.com.br/search?updated-min=2009-01-01T00:00:00-02:00&updated-max=201001-01T00:00:00-02:00&max-results=50) (109)
2008 (http://www.tocadoelfo.com.br/search?updated-min=2008-01-01T00:00:00-02:00&updated-max=200901-01T00:00:00-02:00&max-results=50) (193)

2007 (http://www.tocadoelfo.com.br/search?updated-min=2007-01-01T00:00:00-02:00&updated-max=200801-01T00:00:00-02:00&max-results=50) (143)


2006 (http://www.tocadoelfo.com.br/search?updated-min=2006-01-01T00:00:00-02:00&updated-max=200701-01T00:00:00-02:00&max-results=11) (11)

CURTA NOSSA PGINA!

EncontrenosnoFacebook

#tocadoelfo
Curtir

2.669pessoascurtiram#tocadoelfo.

PluginsocialdoFacebook

FOLLOWERS

Participardestesite
GoogleFriendConnect

Membros(864) Mais

Jummembro?Fazerlogin

PAGEVIEWS (30 DIAS)

74,169

RECEBA POSTS POR E-MAIL

Digite seu e-mail

Enviar

Este blog possui atualmente:


3349 comentrios em 707 postagens!
Encontre-nos no Google+ (https://plus.google.com/103213086253279791179)

CC 3.0 BR - Voc pode compartilhar ou adaptar qualquer contedo, desde que d o crdito apropriado.
Tecnologia do Blogger (http://www.blogger.com).

(https://www.facebook.com/JonatasBermudes)

(https://twitter.com/jonatasbermudes)

(https://plus.google.com/u/0/117672948711989017748)

(http://instagram.com/jonatasbermudes)

Copyright 2014 #tocadoelfo (http://www.tocadoelfo.com.br/) / Tema criado por Themexpose (http://www.themexpose.com/).


Adaptado por Jonatas Bermudes (http://jonatasdesigner.com.br).

S-ar putea să vă placă și