LOI_summer的博客

凡所历经 莫非一成

【清明】最小生成树

Kruskal && Prim

最小生成树的定义:在一给定的无向图G = (V, E) 中,(u,v) 代表连接顶点u与顶点v的边,而w(u, v) 代表此边的权重,若存在T为E的子集,使得所有的点联通且为无环图,使得w(T) 最小,则此T为G的最小生成树。
其中w(T)= ∑_((u, v)∈T w(u, v)

Kruskal
所有边从小到大排序,保证选取的边最优
每次选取,合并两个点,代表联通//并查集
如果这条边的两个点已经在同一个集合里 就不选这条边
选取后权值加入最小生成树权值和中

代码如下

int find(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);}
bool same(int x,int y){return find(x) == find(y);}
bool cmp(edge a,edge b){ return a.v < b.v; }

void merge(int x,int y){
    x = find(x); y = find(y);
    if(deep[x] > deep[y]) swap(x,y);
    fa[x] = y;
    if(deep[x] == deep[y]) deep[y] ++;
    return;
}

int kru(){
    int ans = 0;
    sort(l + 1, l + tot + 1,cmp);
    for(int i = 1; i <= tot; i ++)
        if(!same(l[i].f,l[i].t))
            merge(l[i].f,l[i].t),ans += l[i].v;
    return ans;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Loi_Shirley/article/details/76635077
个人分类: ===【清明】===
上一篇【清明】栈和队列
下一篇【POJ 2312】Battle City
想对作者说点什么? 我来说一句

最小生成树

2011年10月12日 1.52MB 下载

没有更多推荐了,返回首页

关闭
关闭