最小生成树

    性质:n个节点生成的最小生成树有n-1条边 & 最小生成树里多加一条边能生成含该边的一个环

    构造方法:Prim算法 & Kruskal算法

一、Prim算法:逐个点连通的方式构造最小生成树(时间复杂度O(n*n),适合稠密图)

    稀疏图&稠密图:有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph),反之边的条数|E|接近|V|²,称为稠密图(dense graph)。

设计思想:

贪心法之prim算法和Kruskal算法

    Prim算法是从一个点开始,在给的无向图中寻找这个点所连接的权值最小的边,并在树中连接这条边,再寻找树中节点在无向图连接的权值最小的边,找到之后要判断这条边是否会构成一个环,最小生成树中是不能出现环的。

伪代码如下:
贪心法之prim算法和Kruskal算法

    下图的例子:①从点1开始,权值最小的边是(1,3),权值为1,连接;②点1和点3在原始无向图中权值最小的边是(3,6),权值为4,连接;③从点1、点3和点6中权值最小的边是(6,4),权值为2连接;④在点1、3、6、4中权值最小的边是(4,1)和(3,2),权值都为5,但是(4,1)连接后会构成环,所以不能连接(4,1);⑤再找点1、3、6、4、2中权值最小的边,连接(2,5),完成最小生成树的构造。

贪心法之prim算法和Kruskal算法

prim算法正确性证明:
贪心法之prim算法和Kruskal算法

 贪心法之prim算法和Kruskal算法

 贪心法之prim算法和Kruskal算法

 贪心法之prim算法和Kruskal算法

  贪心法之prim算法和Kruskal算法

 贪心法之prim算法和Kruskal算法

代码实现如下:

#include<iostream>
#include<cstring>
using namespace std;
 
int n,m;
int map[101][101];
 
void prim()  //最小生成树 prim算法
{
    cout<<"prim:"<<endl;
    int lowcost[101];  //lowcost[i]存树中点到i点的边的权值最小为多少 => 为多少?
    int closest[101];  //closest[i]存放树中哪个点到i点的边的权值最小 => 是哪个?
    bool s[101];
    s[1] = true;  //选择1为树顶
    int i,j,k;
    for(i=2;i<=n;i++)  //初始化lowcost和s
    {
        lowcost[i] = map[1][i];
        s[i] = false;
        closest[i] = 1;
    }
    int min;
    for(i=1;i<n;i++)  //最小生成树只有n-1条边
    {
        min = 100000;
        k = 1;
        for(j=2;j<=n;j++)  //找最小边
        {
            if((lowcost[j]<min)&&(!s[j]))
            {
                min = lowcost[j];
                k = j;
            }
        }
        cout<<closest[k]<<","<<k<<":"<<min<<endl;
        s[k] = true;
        for(j=2;j<=n;j++)
        {
            if((map[k][j]<lowcost[j])&&(!s[j]))  //如果新的结点到j的边比原来的结点到j的边小,就用新结点替换掉原结点
            {
                lowcost[j] = map[k][j];
                closest[j] = k;
            }
        }
    }
}
 
int main()
{
    cin>>n>>m;
    int i,a,b,tem;
    memset(map,0x3f,sizeof(map));  //memset要用0x3f
    for(i=1;i<=m;i++)
    {
        cin>>a>>b;
        cin>>tem;
        map[a][b] = tem;
        map[b][a] = tem;
    }
    prim();
    return 0;
}
View Code

相关文章: