树结构_最小生成树_Prime算法

来源:互联网 发布:冒险岛数据查询 编辑:程序博客网 时间:2024/05/29 10:42

输入:一个加权连通图

算法思路:将图分为两个部分,一个是已经进入最小生成树的部分a,一个是还未进入最小生成树的部分b

                   现在我们在连接a和b的边中找到一条最小的,并把它加入最小生成树中

                   重复这个过程直到所有点都进入最小生成树

初始化:将第一个点的数据放入最小生成树即可

数学证明:

反证法:假设prim生成的不是最小生成树

1).设prim生成的树为G0

2).假设存在Gmin使得cost(Gmin)<cost(G0)   则在Gmin中存在<u,v>不属于G0

3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)

4).这与prim每次生成最短边矛盾

5).故假设不成立,命题得证.

代码模板:

long Prime(int n,int Graph[maxn][maxn]){    int vis[maxn],d[maxn];    memset(vis,0,sizeof(vis));    for (int i=1;i<=n;i++)        d[i]=Graph[1][i];//初始化:从第一个点开始    for (int i=1;i<=n;i++)//一次找一个点所以需要n次这里的i只是为了计数而已    {        int Min=inf,v;        for (int j=1;j<=n;j++)            if (!vis[j]&&d[j]<Min)        {Min=d[j];v=j;}//找出不在集合里的距离最小的点        vis[v]=1;//这个东西就可以保证d[j]不再变化        for (int j=1;j<=n;j++)//保证在d[i]为i到连接到以联通的图中的最短路线博主真是太聪明了            if (!vis[j]&&d[j]>Graph[v][j])            d[j]=Graph[v][j];    }    long cost(0);    for (int i=1;i<=n;i++)        cost+=d[i];    return cost;}


0 0
原创粉丝点击