0% acharam este documento útil (0 voto)
56 visualizações13 páginas

Grafos C++

Enviado por

plucio741
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
56 visualizações13 páginas

Grafos C++

Enviado por

plucio741
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Grafos são estruturas de dados fundamentais em ciência da computação, usadas para

representar conjuntos de objetos (vértices ou nós) e suas relações (arestas). Em C++, você
pode implementar grafos de várias maneiras dependendo do tipo de grafo e da aplicação,
como matrizes de adjacência, listas de adjacência ou até representações baseadas em
classes e objetos.

Aqui está uma visão geral e exemplos de implementações:

1. Lista de Adjacência

Essa representação é eficiente em termos de memória, especialmente para grafos


esparsos.

#include <iostream>

#include <vector>

using namespace std;

class Grafo {

int V; // Número de vértices

vector<vector<int>> adj; // Lista de adjacência

public:

Grafo(int V) {

this->V = V;

[Link](V);

void adicionarAresta(int u, int v) {

adj[u].push_back(v);

adj[v].push_back(u); // Para grafo não direcionado

}
void mostrarGrafo() {

for (int i = 0; i < V; i++) {

cout << "Vértice " << i << ": ";

for (int v : adj[i]) {

cout << v << " ";

cout << endl;

};

int main() {

Grafo g(5);

[Link](0, 1);

[Link](0, 4);

[Link](1, 2);

[Link](1, 3);

[Link](1, 4);

[Link](3, 4);

[Link]();

return 0;

}
2. Matriz de Adjacência

Essa representação usa mais memória, mas é útil para grafos densos e para verificar
rapidamente a existência de uma aresta.

#include <iostream>

using namespace std;

class Grafo {

int V; // Número de vértices

int **adj; // Matriz de adjacência

public:

Grafo(int V) {

this->V = V;

adj = new int*[V];

for (int i = 0; i < V; i++) {

adj[i] = new int[V];

for (int j = 0; j < V; j++) {

adj[i][j] = 0;

void adicionarAresta(int u, int v) {

adj[u][v] = 1;

adj[v][u] = 1; // Para grafo não direcionado

}
void mostrarGrafo() {

for (int i = 0; i < V; i++) {

for (int j = 0; j < V; j++) {

cout << adj[i][j] << " ";

cout << endl;

~Grafo() {

for (int i = 0; i < V; i++) {

delete[] adj[i];

delete[] adj;

};

int main() {

Grafo g(5);

[Link](0, 1);

[Link](0, 4);

[Link](1, 2);

[Link](1, 3);

[Link](1, 4);

[Link](3, 4);
[Link]();

return 0;

3. Grafo com Pesos (Usando Lista de Adjacência)

Se o grafo possui arestas com pesos, você pode usar pares para armazenar o vértice e o
peso da aresta.

#include <iostream>

#include <vector>

using namespace std;

class Grafo {

int V;

vector<vector<pair<int, int>>> adj;

public:

Grafo(int V) {

this->V = V;

[Link](V);

void adicionarAresta(int u, int v, int peso) {

adj[u].emplace_back(v, peso);

adj[v].emplace_back(u, peso); // Para grafo não direcionado

}
void mostrarGrafo() {

for (int i = 0; i < V; i++) {

cout << "Vértice " << i << ": ";

for (auto p : adj[i]) {

cout << "(" << [Link] << ", " << [Link] << ") ";

cout << endl;

};

int main() {

Grafo g(5);

[Link](0, 1, 10);

[Link](0, 4, 20);

[Link](1, 2, 30);

[Link](1, 3, 40);

[Link](1, 4, 50);

[Link](3, 4, 60);

[Link]();

return 0;

Expansões Possíveis
1. Implementar Algoritmos: Adicione algoritmos como BFS, DFS, Dijkstra, Prim, ou
Kruskal.
2. Grafo Direcionado: Adapte os métodos para lidar com grafos direcionados.
3. Grafo Dinâmico: Use estruturas como unordered_map ou map para grafos de
tamanho dinâmico.

🚀
Essas implementações oferecem uma base sólida para trabalhar com grafos em C++. Se
precisar de um exemplo específico ou de mais detalhes, é só perguntar!

Grafos são estruturas de dados fundamentais em ciência da computação, usadas para


representar conjuntos de objetos (vértices ou nós) e suas relações (arestas). Em C++, você
pode implementar grafos de várias maneiras dependendo do tipo de grafo e da aplicação,
como matrizes de adjacência, listas de adjacência ou até representações baseadas em
classes e objetos.

Aqui está uma visão geral e exemplos de implementações:

1. Lista de Adjacência

Essa representação é eficiente em termos de memória, especialmente para grafos


esparsos.

#include <iostream>

#include <vector>

using namespace std;

class Grafo {

int V; // Número de vértices

vector<vector<int>> adj; // Lista de adjacência

public:

Grafo(int V) {

this->V = V;

[Link](V);

}
void adicionarAresta(int u, int v) {

adj[u].push_back(v);

adj[v].push_back(u); // Para grafo não direcionado

void mostrarGrafo() {

for (int i = 0; i < V; i++) {

cout << "Vértice " << i << ": ";

for (int v : adj[i]) {

cout << v << " ";

cout << endl;

};

int main() {

Grafo g(5);

[Link](0, 1);

[Link](0, 4);

[Link](1, 2);

[Link](1, 3);

[Link](1, 4);

[Link](3, 4);

[Link]();
return 0;

2. Matriz de Adjacência

Essa representação usa mais memória, mas é útil para grafos densos e para verificar
rapidamente a existência de uma aresta.

#include <iostream>

using namespace std;

class Grafo {

int V; // Número de vértices

int **adj; // Matriz de adjacência

public:

Grafo(int V) {

this->V = V;

adj = new int*[V];

for (int i = 0; i < V; i++) {

adj[i] = new int[V];

for (int j = 0; j < V; j++) {

adj[i][j] = 0;

void adicionarAresta(int u, int v) {


adj[u][v] = 1;

adj[v][u] = 1; // Para grafo não direcionado

void mostrarGrafo() {

for (int i = 0; i < V; i++) {

for (int j = 0; j < V; j++) {

cout << adj[i][j] << " ";

cout << endl;

~Grafo() {

for (int i = 0; i < V; i++) {

delete[] adj[i];

delete[] adj;

};

int main() {

Grafo g(5);

[Link](0, 1);

[Link](0, 4);

[Link](1, 2);
[Link](1, 3);

[Link](1, 4);

[Link](3, 4);

[Link]();

return 0;

3. Grafo com Pesos (Usando Lista de Adjacência)

Se o grafo possui arestas com pesos, você pode usar pares para armazenar o vértice e o
peso da aresta.

#include <iostream>

#include <vector>

using namespace std;

class Grafo {

int V;

vector<vector<pair<int, int>>> adj;

public:

Grafo(int V) {

this->V = V;

[Link](V);

void adicionarAresta(int u, int v, int peso) {


adj[u].emplace_back(v, peso);

adj[v].emplace_back(u, peso); // Para grafo não direcionado

void mostrarGrafo() {

for (int i = 0; i < V; i++) {

cout << "Vértice " << i << ": ";

for (auto p : adj[i]) {

cout << "(" << [Link] << ", " << [Link] << ") ";

cout << endl;

};

int main() {

Grafo g(5);

[Link](0, 1, 10);

[Link](0, 4, 20);

[Link](1, 2, 30);

[Link](1, 3, 40);

[Link](1, 4, 50);

[Link](3, 4, 60);

[Link]();

return 0;
}

Expansões Possíveis

1. Implementar Algoritmos: Adicione algoritmos como BFS, DFS, Dijkstra, Prim, ou


Kruskal.
2. Grafo Direcionado: Adapte os métodos para lidar com grafos direcionados.
3. Grafo Dinâmico: Use estruturas como unordered_map ou map para grafos de
tamanho dinâmico.

🚀
Essas implementações oferecem uma base sólida para trabalhar com grafos em C++. Se
precisar de um exemplo específico ou de mais detalhes, é só perguntar!

Você também pode gostar