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

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
Insérer ici l'image Description
Si les deux graphique 1- undirected> 2, il y a 2>. 1.
② avec des poids
Insérer ici l'image Description

(2) la matrice d'adjacence

Insérer ici l'image Description

(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
Insérer ici l'image Description

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;
}

Insérer ici l'image Description
Insérer ici l'image Description

Publié 51 articles originaux · louange gagné 1 · vues 1358

Je suppose que tu aimes

Origine blog.csdn.net/shi_xiao_xuan/article/details/104860257
conseillé
Classement