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
Si tanto grafo no dirigido 1-> 2, hay 2->. 1.
② con los pesos
(2) la matriz de adyacencia
(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
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;
}