Apuntes de clase: árbol de expansión mínimo


El costo de un árbol de expansión mínimo (árbol de expansión mínimo) árbol de expansión : Sea G = (V, E) una red conectada no dirigida, y la suma de los pesos de los bordes en el árbol de expansión se llama el costo del árbol de expansión.
Árbol de expansión mínimo : entre todos los árboles de expansión en el gráfico G, el árbol de expansión de costo mínimo se llama árbol de expansión mínima.
La naturaleza de MST (árbol de expansión mínimo)
supone que G = (V, E) es una red conectada no dirigida, y U es un subconjunto no vacío del conjunto de vértices V. Si (u, v) es un borde con un peso mínimo, donde u ∈ U, v ∈ V-U, entonces debe haber un árbol de expansión mínimo que contenga el borde (u, v).
Aplicación de propiedades MST
Construir un árbol de expansión de costo mínimo
Dos métodos: Método principal: Método de agregar punto, Método de Kruskal: Agregar método de borde
Algoritmo Prim
Idea básica :
Sea G = (V, E) una red conectada con n vértices, T = ( U, TE) es el árbol de expansión mínimo de G. El estado inicial de T es U = {u0} (u0∈V), TE = {}, y repite las siguientes operaciones: entre todos los bordes de u∈U, v∈VU Encuentre una arista (u, v) con el menor costo y combínelo en el conjunto TE, y al mismo tiempo, v se fusiona en U hasta U = V.
Diseño de estructura de datos
Array lowcost [n]: se usa para guardar el peso de cada vértice en el conjunto VU y el lado más corto del vértice en el conjunto U, lowcost [v] = 0 significa que el vértice v se ha agregado al árbol de expansión mínimo;
arreglo adjvex [n]: Se utiliza para guardar los vértices en el conjunto U (el lado más corto de cada vértice en el conjunto VU y el lado más corto en el conjunto U) al que está unido el borde.
Pseudocódigo de algoritmo Prim
1. Inicialice dos matrices auxiliares lowcost (= arc [0] [i]) y adjvex (= 0) (0 es el punto de partida); 2. Emite el vértice u0 y agrega el vértice u0 para establecer U;
3. Repita las siguientes operaciones n-1 veces
3.1. Seleccione el borde más corto (lowcost [k]) en lowcost y tome el número de vértice correspondiente k;
3.2. Obtenga el vértice k y el peso correspondiente;
3.3. Agregue el vértice k al conjunto U (lowcost [k ] = 0);
3.4, ajustar la matriz lowcost y adjvex;

Void prime(MGraph G){     
	for(int i=1;i<G.vertexNu;i++){         
		lowcost[i]=G.arc[0][i];  
		adjvex[i]=0;     
	}     
	lowcost[0]=0;
	for(i=1;i<G.vertexNum;i+++){         
		k=MinEdge(lowcost,G.vertexNum)         
		cout<<K<<adjvex[k]<<lowcost[k];         
		lowcost[k]=0;
		for(j=1;j<G.vertexNum;j++)           
			if((G.arc[k][j]<lowcost[j]){               
				lowcost[j]=G.arc[k][j];               
				arcvex[j]=k;            
			}     
	} 
}

Complejidad temporal: O (n2), adecuada para gráficos densos.
La
idea básica del algoritmo de Kruskal :
1. Que la red conectada no dirigida sea G = (V, E), que el árbol de expansión mínimo de G sea T = (U, TE), y su estado inicial sea U = V, TE = {},
2 Luego, de acuerdo con el orden de los pesos de los bordes de pequeño a grande, examine cada borde en el conjunto de bordes E de G. 2.1 Si los dos vértices del borde examinado pertenecen a dos componentes conectados diferentes de T, agregue este borde como el árbol de expansión mínimo a T y conecte los dos componentes conectados en un componente conectado;
2.2. Si los dos vértices del borde inspeccionado pertenecen al mismo componente conectado, este borde se descarta para evitar bucles:
3. De esta manera, cuando el número de componentes conectados en T es 1, este componente conectado es un árbol de G Árbol de expansión mínimo.
Idea del algoritmo de Kruskal
1. Inicialización: U = V; TE = {};
2. Haga un bucle hasta que el número de componentes conectados en T sea 1
2.1. Encuentre el lado más corto (u, v) en E;
2.2. Si los vértices u, v Dos componentes conectados diferentes en T, luego
2.2.1, fusionan los bordes (u, v) en TE;
2.2.2, fusionan estos dos componentes conectados en uno;
2.3, marcan los bordes (u, v en E) ), De modo que (u, v) no participe en la selección posterior del borde más corto;
tres cuestiones clave en la implementación del algoritmo de Kruskal
1. La estructura
de almacenamiento del gráfico El conjunto de conjuntos de bordes se utiliza para almacenar el gráfico.
2. Cómo determinar que los dos vértices unidos a un borde están en el mismo componente conectado (y conjunto de verificación) para
definir la matriz Parent [i]. El valor del componente de matriz representa el nodo padre del vértice i (el valor inicial es -1;)
Cuando los nodos raíz de dos vértices de un borde (u, v) son diferentes, los dos nodos pertenecen a diferentes componentes conectados (use la matriz principal para encontrar el nodo raíz de un árbol. Cuando el padre de un nodo n == - 1. El nodo raíz del árbol es n)
3. Cómo fusionar los dos vértices unidos a un borde en el mismo componente conectado para fusionar los componentes conectados,
el nodo raíz del árbol donde un vértice es vex1, el otro El nodo raíz del árbol donde se encuentra el vértice es vex2, luego: parent [vex2] = vex1;

int Find(int *parent, int node){  
	int f;  
	f=node;  
	while(parent[f]>-1)   
		f=parent[f];  
	return f; 
}
int main(){     
	int arcNum, int vertexNum;     
	EdgeNode *edge;     
	int *parent;
	cout<<"please input the number of vertexNum:"; 
	cin>>vertexNum;     
	cout<<"please input the number of edges:"; 
	cin>>arcNum;     
	edge=new EdgeNode[arcNum]; 
	parent=new int[vertexNum];
	for(int i=0;i<arcNum;i++){   
		cout<<"Please input the edges:";  
		cin>>edge[i].from>>edge[i].to>>edge[i].weight;     
	}
	sort(edges, G);   
	for (i=0;i<vertexNum;i++)  
		parent[i]=-1;
	int k=0,begin,end,count=0;     
	cout<<"next is the MST :"<<endl;
	for (k=0;k<arcNum;k++){          
		begin=edge[k].from; 
		end=edge[k].to;           
		int m,n;         
		m=Find(parent,begin); 
		n=Find(parent,end);         
		if(m!=n){
			cout<<begin<<","<<end<<","<<edge[k].weight<<endl;             
			parent[n]=m;              
			count++;             
			if(count==vertexNum-1) 
				break;        
		}    
	}    
	return 0; 
}

Análisis de la complejidad del tiempo del algoritmo de Kruskal
Clasificación de la matriz de conjuntos de bordes, complejidad del tiempo O (eloge), selección del borde entre los bordes e, la complejidad del tiempo es O (e), por lo que la complejidad del tiempo es O (eloge) .

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

Supongo que te gusta

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