int Find(int s)
{
return father[s]==s?s:Find(father[s]);
}
bool same(int a,int b)
{
a=Find(a);
b=Find(b);
return a==b;
}
void init_union_find(v)//并查集的初始化
{
for(int i=0;i<=v;i++)
{
father[i]=i;
}
}
struct edge
{
int u,v,cost;
};
bool comp (const edge &e1,const edge &e2)
{
return e1.cost <e2.cost;
}
edge es[max_e];
int v,e;//顶点数和边数
int Kruskal()
{
sort(es,es+e,comp);//按照cost从小到大排序
init_union_find(v);//并查集的初始化
int res=0;
for(int i=0;i<e;i++)
{
edge e = es[i];
if(!same(e.u,e.v))
{
unite(e.u,e.v);
res+=e.cost;
}
}
return res;
}
比prim更朴素的Kruskal
最新推荐文章于 2021-12-26 19:55:54 发布