Notas de clase: estructura de almacenamiento de gráficos e implementación

La
idea básica de la matriz de adyacencia (notación de matriz) : use una matriz unidimensional para almacenar información sobre vértices en el gráfico, y use una matriz bidimensional (llamada matriz de adyacencia) para almacenar la relación de adyacencia entre vértices en el gráfico.
La matriz de adyacencia de
un gráfico no dirigido Las características de la matriz de adyacencia de un gráfico no dirigido: la diagonal principal es 0 y debe ser una matriz simétrica.
Cómo encontrar el grado de vértice i: el número de elementos distintos de cero en la i-ésima fila (o i-ésima columna) de la matriz de adyacencia.
Cómo juzgar si hay un borde entre los vértices i y j: pruebe si el elemento arc [i] [j] en la posición correspondiente en la matriz de adyacencia es 1.
Cómo encontrar todos los puntos adyacentes del vértice i: Escanee el elemento de la línea i en la matriz una vez, si el arco [i] [j] es 1, entonces el vértice j es el punto adyacente del vértice i.
La matriz de adyacencia de
un gráfico dirigido es la matriz de adyacencia de un gráfico dirigido necesariamente asimétrica: no necesariamente, por ejemplo, un gráfico completo dirigido.
Cómo encontrar el grado de salida del vértice i: la suma de los elementos de la fila i de la matriz de adyacencia.
Cómo encontrar el grado de vértice i: la suma de los elementos de la columna i de la matriz de adyacencia.
Cómo juzgar si hay una arista desde el vértice i al vértice j: pruebe si el elemento arco [i] [j] en la posición correspondiente en la matriz de adyacencia es 1.
La clase de matriz de adyacencia de almacenamiento gráfico no dirigido

const int MaxSize=10;
template<class T>
class Mgraph{    
public:       
	MGraph(T a[ ], int n, int e );           
	~MGraph( )        
	void DFSTraverse(int v);         
	void BFSTraverse(int v);         
	……
private:        
	T vertex[MaxSize];         
	int arc[MaxSize][MaxSize];         
	int vertexNum, arcNum;
};	

La operación básica del gráfico en la matriz de adyacencia: el constructor
MGraph (T a [], int n, int e);
1. Determine el número de vértices y el número de bordes del gráfico;
2. Almacene la información del vértice de entrada en un vértice de matriz unidimensional Medio;
3. Inicialice la matriz de adyacencia;
4. Ingrese cada borde a su vez y guárdelo en el arco de la matriz de adyacencia;
4.1 Ingrese el número i, j de los dos vértices a los que está unido el borde;
4.2 Establezca el valor del elemento de la i-ésima fila y la columna j de la matriz de adyacencia Establecer en 1;
4.3 Establecer el valor del elemento de la fila j y la columna i-ésima de la matriz de adyacencia a 1;

template<class T>
MGraph::MGraph(T a[ ], int n, int e) {     
	vertexNum=n; arcNum=e;     
	for (i=0; i<vertexNum; i++)          
		vertex[i]=a[i];     
	for (i=0; i<vertexNum; i++)
		for (j=0; j<vertexNum; j++)            
			arc[i][j]=0;
	for (k=0; k<arcNum; k++) {         
		cin>>i>>j;
		arc[i][j]=1;  
		arc[j][i]=1;
	}
}             

El funcionamiento básico de la gráfica en la matriz de adyacencia: primer recorrido en profundidad
⑴ visite el vértice v;
⑵ seleccione un vértice w de los puntos de adyacencia no vistos de v, y proceda con el primer recorrido en profundidad desde w;
⑶ repita los dos pasos anteriores hasta el gráfico Se accede a todos los vértices que tienen una ruta a v.
Definición recursiva

int visited[MaxSize]; 
template<class T>
void MGraph::DFSTraverse(int v){      
	cout<<vertex[v]; visited [v]=1;      
	for (j=0; j<vertexNum; j++)          
		if (arc[v][j]==1 && visited[j]==0)             
			DFSTraverse( j );
}

La operación básica de la gráfica en la matriz de adyacencia: primer recorrido transversal
⑴ visitar el vértice v;
⑵ visitar sucesivamente los puntos de adyacencia no visitados v1, v2, ..., vk;
⑶ visitar desde v1, v2, ..., vk respectivamente Son los puntos vecinos que no han sido visitados, y hacen que "el punto vecino del vértice visitado primero" sea visitado antes que el "punto vecino del vértice visitado después". Hasta que se acceda a todos los vértices en el gráfico que tienen una conexión de ruta con el vértice v.

int visited[MaxSize];
template<class T> 
void MGraph::BFSTraverse(int v){          
	front=rear=-1;
	int Q[MaxSize]; 
	cout<<vertex[v]; 
	visited[v]=1;
	Q[++rear]=v;
	while (front!=rear){
		v=Q[++front];             
		for (j=0; j<vertexNum; j++)
			if (arc[v][j]==1 && visited[j]==0 ){                   
				cout<<vertex[j]; 
				visited[j]=1;
				Q[++rear]=j;             
			}
	} 
}

Otras operaciones en la matriz de adyacencia
Agregue un vértice: inserte la información del vértice en la matriz unidimensional de vértices almacenados e inserte una fila y una columna en la matriz de adyacencia.
Eliminar un vértice: elimine la información del vértice en la matriz unidimensional de vértices almacenados, elimine una fila y una columna en la matriz de adyacencia.
Agregar una arista: modifique el valor del elemento de matriz correspondiente.
Eliminar un borde: modifique el valor del elemento matricial correspondiente.
Lista de adyacencia
Suponiendo que el gráfico G tiene n vértices y bordes e, el almacenamiento del gráfico requiere O (n2).
Idea básica : para cada vértice vi del gráfico, vincule todos los vértices adyacentes a vi en una sola lista vinculada, llamada tabla de borde del vértice vi (para el gráfico dirigido, se llama tabla de borde), el puntero de la cabeza de todas las tablas de borde Una matriz unidimensional que almacena información de vértices constituye una tabla de vértices .
La lista de adyacencia tiene dos tipos de estructuras de nodos: nodos de tabla de vértices y nodos de tabla de borde.
Definir los nodos de la lista de adyacencia.

struct ArcNode{          
	int adjvex;
	ArcNode *next;
};
template<class T> 
struct VertexNode{       
	T vertex;      
	ArcNode *firstedge;
};

La lista de adyacencia de un
gráfico no dirigido Qué representan los nodos en la tabla de borde: cada nodo corresponde a un borde en el gráfico, y la complejidad espacial de la lista de adyacencia es O (n + e).
Cómo encontrar el grado de vértice i: el número de nodos en la tabla de borde del vértice i.
Cómo juzgar si hay un borde entre el vértice i y el vértice j: Pruebe si hay un nodo con el punto final j en la tabla de bordes del vértice i. Cómo encontrar el grado de vértice i en
la lista de adyacencia de un gráfico dirigido (tabla de borde saliente)
: el número de nodos en la tabla de borde saliente del vértice i.
Cómo encontrar el grado de vértice i: el número de nodos con vértice i como punto final en la tabla fuera del borde de cada vértice.
Cómo encontrar todos los puntos adyacentes del vértice i: atraviese la tabla de borde del vértice i, todos los puntos finales en esta tabla de borde son los puntos adyacentes del vértice i.
La lista de adyacencia inversa (tabla de borde entrante)
de un gráfico dirigido es una forma conveniente de calcular el grado de entrada de los vértices de un gráfico dirigido. En la lista de adyacencia inversa, la tabla de bordes almacena un arco con el vértice vi como la cabeza del arco.
Clase de gráfico dirigido de la tienda de listas de adyacencia

const int MaxSize=10;
template<class T>
class ALGraph {        
public:        
	ALGraph(T a[ ], int n, int e);           
	~ALGraph;            
	void DFSTraverse(int v);              
	void BFSTraverse(int v);
	………   
private:        
	VertexNode adjlist[MaxSize];           
	int vertexNum, arcNum;        
};      

La operación básica del gráfico en la lista de adyacencia —— constructor
1. Determine el número de vértices y el número de bordes del gráfico;
2. Ingrese la información del vértice para inicializar la tabla de bordes del vértice;
3. Ingrese la información de los bordes en secuencia y almacénelos en la tabla de bordes.
3.1 ; ingrese el número i y j de los dos vértices unidos al borde;
3.2 genere el nodo s de la tabla de borde con el número de punto adyacente j;
3.3 inserte el nodo s en el encabezado de la tabla i-ésima del borde;

template<class T> 
ALGraph::ALGraph(T a[ ], int n, int e) {        
	vertexNum=n; 
	arcNum=e;      
	for (i=0; i<vertexNum; i++)        
	{        
		adjlist[i].vertex=a[i];        
		adjlist[i].firstedge=NULL;           
	}
	for (k=0; k<arcNum; k++)         
	{          
		cin>>i>>j;              
		s=new ArcNode; 
		s->adjvex=j;                     
		s->next=adjlist[i].firstedge;              
		adjlist[i].firstedge=s;      
	} 
}

La operación básica de la gráfica en la transversal de profundidad de lista de adyacencia

template<class T>
void ALGraph::DFSTraverse(int v){             
	cout<<adjlist[v].vertex;  
	visited[v]=1;     
	p=adjlist[v].firstedge;         
	while (p!=NULL){         
		j=p->adjvex;         
		if (visited[j]==0) 
			DFSTraverse(j);     
		p=p->next;
	}
}

La operación básica del gráfico en la transversal de lista de adyacencia primero

template<class T> 
void ALGraph::BFSTraverse(int v){    
	front=rear=-1;       
	cout<<adjlist[v].vertex;    
	visited[v]=1;   
	Q[++rear]=v;       
	while (front!=rear){        
		v=Q[++front];    
		p=adjlist[v].firstedge;
		while (p!=NULL){             
			j= p->adjvex;             
			if (visited[j]==0){                 
				cout<<adjlist[j].vertex;  
				visited[j]=1; 
				Q[++rear]=j;             
			}             
			p=p->next;        
		}     
	} 
}

Lista de enlaces cruzados : la estructura de almacenamiento encadenado de un gráfico dirigido es
esencialmente representar el mismo arco que aparece dos veces en la lista de adyacencia y la lista de adyacencia inversa de un gráfico dirigido con un nodo.
Múltiples tablas adyacentes : estructura de almacenamiento
conjunto de bordes conjunto de gráfico no dirigido : utilizando dos conjuntos unidimensionales, un conjunto almacena información de vértices y el otro conjunto almacena bordes y sus pesos. El componente de matriz contiene tres campos: los dos vértices a los que está unido el borde y el peso. El orden de los lados en la matriz puede ser arbitrario.
Complejidad del espacio : O (n + e)
encontrar un borde : O (e)
Aplicabilidad : La operación de procesamiento de bordes a su vez. (Método adicional para el árbol de expansión de costo mínimo)
Comparación de la estructura de almacenamiento de gráficos: matriz de adyacencia y matriz de adyacencia de tabla de
adyacencia :
rendimiento espacial: O (n2)
rendimiento de tiempo: O (n2)
alcance de la aplicación: tabla de adyacencia de gráfico denso : rendimiento espacial : O (n + e) rendimiento de tiempo: O (n + e) ámbito de aplicación: gráfico disperso



48 artículos originales publicados · Me gusta 25 · Visita 2453

Supongo que te gusta

Origin blog.csdn.net/qq_43628959/article/details/103274695
Recomendado
Clasificación