Expresión de la Fortuna almacenar sujeto class6- método basado izquierda en la figura 1

1. Título: Expresión de almacenamiento de mapa

figura de almacenamiento: 1) tabla de matriz 2) adyacencia adyacente
cómo expresar gráfico? mapa generado?

2. Análisis

tabla de adyacencia (1) Método

① no ponderado
Aquí Insertar imagen Descripción
Si tanto grafo no dirigido 1-> 2, hay 2->. 1.
② con los pesos
Aquí Insertar imagen Descripción

(2) la matriz de adyacencia

Aquí Insertar imagen Descripción

(3) la expresión de la matriz (Asunto aparecen a menudo)

Hay tres columnas verticales, cada peso respectivamente los pesos, las fuentes de, dirigida a
Aquí Insertar imagen Descripción

3. La Fig almacena en la memoria

En la memoria, expresado comúnmente clase.

(1) gráfico de la clase

bit clase Graph y dos lados principales, utilizando nodo de almacenamiento hash_map, usando información almacenada en la hash_set borde

class Graph
{
public:
	unordered_map<int,Node*> nodes;
	unordered_set<Edge*> edges; 
	Graph(){};		
};

A continuación se deben interpretar nodos y bordes

(2) Nodo clase

nodo de datos tiene cinco partes, a saber, el valor del valor de nodo, el grado de en, fuera de la OUT, nextS siguiente nodo del nodo actual, y los lados a partir de nodo actual.

class Node
{
public:
	int value;
	int	out;
	int in;
	list<Node*> nexts;
	list<Edge*> edges;

	Node(int val,int inn = 0,int outt = 0):value(val),in(inn),out(outt){}
	
};

(3) Edge clase

nodo de datos tiene tres partes, a saber, el borde derecho del peso, y al nodo actual desde el lado

class Edge
{
public:
	int weight;
	Node* from;
	Node* to;

	Edge(int wgt,Node* f,Node* t):weight(wgt),from(f),to(t){}
	
};

(4) GraphGenerator clase

El paquete sería una clase generadora de funciones. Nota: El uso de (3) en una matriz de manera
proceso de generación de la figura sigue,
① Sr. en un objeto gráfico de acuerdo con las filas de la matriz, los pesos asignados al primer elemento, un segundo, un tercer elemento representa el valor asignado al nodo y desde a;
② para determinar la cifra actual de, en cuanto a si la pena no existe el nodo, crear un nodo en el gráfico
③ y luego desde el nodo de trazar, con el borde de construcción;
nodo de punto a nodo ④ suplemento de borde grados fuera. Complementario del grado del nodo;
⑤ añadido al lado del borde establecido en la figura.

class GraphGenerator
{
public:
	Graph createGraph(vector<vector<int> > matrix)
	{
		Graph graph;//需要graph的node和edge 、node有五个data、edge有三个data 
		for(int i = 0; i < matrix.size();++i)
		{
			int weight = matrix[i][0];
			int from = matrix[i][1];
			int to = matrix[i][2];
			//Graph的node里不含有from节点、to节点时建上 
			if(graph.nodes.find(from) == graph.nodes.end())
				graph.nodes[from] = new Node(from);
			if(graph.nodes.find(to) == graph.nodes.end())
				graph.nodes[to] = new Node(to);
			//拿出from,to点
			Node* fromNode = graph.nodes[from];		
			Node* toNode = graph.nodes[to];
			//Node* fromNode = graph.nodes.find(from)->second;		
			//Node* toNode = graph.nodes.find(to)->second;
			//新建边 
			Edge* newEdge = new Edge(weight, fromNode, toNode);
			
			//增加节点的四个数据 
			fromNode->nexts.push_back(toNode);
			fromNode->edges.push_back(newEdge);
			fromNode->out++;
			toNode->in++;
			
			
			graph.edges.insert(newEdge);	
		}
		return graph; 
	} 
};

(5) Pruebas

Todos los nodos de salida de la gráfica y los bordes

	//test 
	unordered_map<int,Node*>::iterator ite1 = graph.nodes.begin();
	while(ite1 != graph.nodes.end())
	{
	 	cout << "节点: "<<(ite1)->second->value<<"、";
		//cout << "节点: "<<(ite1)->first<<"、";
	 	ite1++;
	}
	cout<<endl<<"-----------------------------------------------"<<endl ;
	unordered_set<Edge*>::iterator ite = graph.edges.begin();
	while(ite != graph.edges.end())
	{
	 	cout << "边权为 "<<(*ite)->weight<<"    ";
	 	cout<<(*ite)->from->value <<"---->"<<(*ite)->to->value<<endl; 
	 	ite++;
	}
	cout<<endl<<"-----------------------------------------------"<<endl ;

4. El código completo

#include <iostream>

#include<unordered_map> 
#include<unordered_set>
#include<list>
#include<vector> 
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

class Edge;
class Node
{
public:
	int value;
	int	out;
	int in;
	list<Node*> nexts;
	list<Edge*> edges;

	Node(int val,int inn = 0,int outt = 0):value(val),in(inn),out(outt){}	
};

class Edge
{
public:
	int weight;
	Node* from;
	Node* to;

	Edge(int wgt,Node* f,Node* t):weight(wgt),from(f),to(t){}	
};

class Graph
{
public:
	unordered_map<int,Node*> nodes;
	unordered_set<Edge*> edges; 

	Graph(){};		
};

class GraphGenerator
{
public:
	Graph createGraph(vector<vector<int> > matrix)
	{
		Graph graph;//需要graph的node和edge 、node有五个data、edge有三个data 
		for(int i = 0; i < matrix.size();++i)
		{
			int weight = matrix[i][0];
			int from = matrix[i][1];
			int to = matrix[i][2];
			//Graph的node里不含有from节点、to节点时建上 
			if(graph.nodes.find(from) == graph.nodes.end())
				graph.nodes[from] = new Node(from);
			if(graph.nodes.find(to) == graph.nodes.end())
				graph.nodes[to] = new Node(to);
			//拿出from,to点
			Node* fromNode = graph.nodes[from];		
			Node* toNode = graph.nodes[to];
			//Node* fromNode = graph.nodes.find(from)->second;		
			//Node* toNode = graph.nodes.find(to)->second;
			//新建边 
			Edge* newEdge = new Edge(weight, fromNode, toNode);
			
			//增加节点的四个数据 
			fromNode->nexts.push_back(toNode);
			fromNode->edges.push_back(newEdge);
			fromNode->out++;
			toNode->in++;
			
			
			graph.edges.insert(newEdge);	
		}
		return graph; 
	} 
};

int main(int argc, char** argv) {
	GraphGenerator g;
	vector<vector<int> > matrix= {{7,1,2},{5,1,3},{2,2,3}};
	Graph graph = g.createGraph(matrix);

	//test 
	unordered_map<int,Node*>::iterator ite1 = graph.nodes.begin();
	while(ite1 != graph.nodes.end())
	{
	 	cout << "节点: "<<(ite1)->second->value<<"、";
		//cout << "节点: "<<(ite1)->first<<"、";
	 	ite1++;
	}
	cout<<endl<<"-----------------------------------------------"<<endl ;
	unordered_set<Edge*>::iterator ite = graph.edges.begin();
	while(ite != graph.edges.end())
	{
	 	cout << "边权为 "<<(*ite)->weight<<"    ";
	 	cout<<(*ite)->from->value <<"---->"<<(*ite)->to->value<<endl; 
	 	ite++;
	}
	cout<<endl<<"-----------------------------------------------"<<endl ;
	
	return 0;
}

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Publicado 51 artículos originales · ganado elogios 1 · vistas 1358

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/104860257
Recomendado
Clasificación