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.