Expression de Fortune Méthode de stockage sujet sur la base class6- gauche sur la figure 1
- 1. Titre: Expression de la carte de stockage
- 2. Analyse
- (1) Méthode de la table d'adjacence
- (2) la matrice d'adjacence
- (3) l'expression de la matrice (sujet apparaissent souvent)
- 3. La figure stocké dans la mémoire
- (1) Le graphique de la classe
- (2) la classe Node
- (3) Classe bord
- (4) classe GraphGenerator
- (5) Essai
- 4. Le code complet
1. Titre: Expression de la carte de stockage
Figure stockage: 1) adjacent tableau 2) matrice de contiguïté
comment exprimer graphique? Generated carte?
2. Analyse
(1) Méthode de la table d'adjacence
① non pondérée
Si les deux graphique 1- undirected> 2, il y a 2>. 1.
② avec des poids
(2) la matrice d'adjacence
(3) l'expression de la matrice (sujet apparaissent souvent)
Il y a trois colonnes verticales, chaque poids respectivement des poids, des sources à partir, dirigée vers
3. La figure stocké dans la mémoire
En mémoire, classe couramment exprimée.
(1) Le graphique de la classe
Graphique bit de classe et deux grands côtés, en utilisant le noeud de stockage de hash_map, en utilisant les informations stockées dans le bord hash_set
class Graph
{
public:
unordered_map<int,Node*> nodes;
unordered_set<Edge*> edges;
Graph(){};
};
Ci-dessous doit être interprété noeuds et arêtes
(2) la classe Node
le noeud de données comporte cinq parties, à savoir, la valeur de la valeur du noeud, le degré de dans, hors de l'OUT, nExts noeud suivant du noeud courant, et les côtés en partant du noeud courant.
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) Classe bord
le noeud de données comporte trois parties, à savoir, le bord droit du poids, et au noeud de courant du côté
class Edge
{
public:
int weight;
Node* from;
Node* to;
Edge(int wgt,Node* f,Node* t):weight(wgt),from(f),to(t){}
};
(4) classe GraphGenerator
Le paquet serait une classe de génération de fonction. Note: L'utilisation de (3) dans une matrice de manière
processus de génération suit la figure,
① M. dans un objet graphique selon les lignes de la matrice, les coefficients de pondération attribués au premier élément, un second, un troisième élément représente la valeur attribuée au noeud et à partir de à,
② pour déterminer le chiffre actuel de, pour savoir s'il vaut le nœud n'existe pas, créez un nœud dans le graphe
③ puis du nœud à tracer, bord de construction,
point de nœud à nœud ④ supplément de, bord degrés sur. Complémentaire au degré du noeud;
⑤ ajouté au côté de bord mis en place sur la Fig.
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) Essai
Tous les noeuds de sortie du graphe et des arêtes
//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. Le code complet
#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;
}