Dos soluciones para un árbol de expansión mínimo

Directorio de artículos

Remilgado

Se utiliza un algoritmo codicioso. Es un algoritmo que agrega aristas continuamente a partir de un cierto vértice.

int cost[MAX_V][MAX_V];//存边权
int mincost[MAX_V];//从集合X出发的边到每个顶点的最小权值
int book[MAX_V];
int V;

int prim(){
    
    
	for(int i=0;i<V;i++){
    
    
		mincost[i]=INF;
		book[i]=0;
	}
	mincost[0]=0;
	int res=0;
	
	while(1){
    
    
		int v=-1;
		//从不属于X的顶点中选取从X到其权值最小的顶点
		for(int i=0;i<V;i++){
    
    
			if(!book[i]&&(v==-1||mincost[i]<mincost[v])) v=i;
		}

		if(v==-1)break;
		book[v]=1;//将v加入集合
		res+=mincost[v];
		
		//根据当前点更新到其余点的距离
		for(int i=0;i<V;i++){
    
    
			mincost[i]=min(mincost[i],cost[v][i]);
		}
	}
}

Kruskal

Kruskal primero ordena los bordes de menor a mayor y agrega nuevos bordes si no hay bucles o bordes dobles.
La forma de determinar si no se genera un círculo es determinar primero si el uv está en un componente conectado al agregar un borde conectado a uv al conjunto, y si no, entonces este borde se puede agregar.
El método de evaluación adopta y encuentra colección.

struct edge{
    
    int from,to,cost};
bool cmp(const edge &a,const edge &b){
    
    return a.cost<b.cost;}

edge es[MAX_E]int V,E;

int kruskal(){
    
    
	sort(es,es+E,cmp);
	init();
	int res=0;
	for(int i=0;i<E;i++){
    
    
		edge e=es[i];
		if(!same(e.from,e.to)){
    
    
			merge(e.from,e.to);
			res+=e.cost;
		}
	}
	return res;
}

para resumir

La complejidad de los dos algoritmos anteriores después de la optimización es aproximadamente la misma.

Supongo que te gusta

Origin blog.csdn.net/DwenKing/article/details/107722335
Recomendado
Clasificación