加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Prim算法的优化

(2011-08-03 15:37:33)
标签:

prim

算法

优化

连通

生成树

原始Prim算法只能对单连通图进行处理,有时出现多个连通图时,有需要统计最小生成树的数量及具体结点则显得不方便了,为此对Prim算法作了优化,degree返回有几棵最小生成树,函数返回所有最小生成树长度之和,代码如下:

int n;    //结点数量

int s[MAX][MAX]; //图

int tree[MAX][MAX]; //生成树图,s[i][j]=0表示i与j之间不通

int visit[MAX]; //标记是否访问

int root[MAX]; //标记每棵生成树的根


int Prim(int &degree)

{

   degree = 0;

   int ans = 0;

   int cost[MAX];


   memset(visit, 0, sizeof(visit));

   memset(tree, 0, sizeof(tree));

   memset(root, 0, sizeof(root));


   for(int i = 1; i <= n; ++i)

   {

      if(visit[i] == 0)

      {

         root[++degree] = i;

         visit[i] = degree;


         memset(cost, 0, sizeof(cost));


         for(int j = 1; j <= n; ++j)

         {

            if(j != i && visit[j] == 0 && s[i][j] != 0)

            {

               cost[j] = i;

            }

         }


         for(int j = 1; j <= n; ++j)

         {

            int min = 0x7FFFFFFF;

            int tmp = -1;


            for(int k = 1; k <= n; ++k)

            {

               if(visit[k] == 0 && cost[k] != 0)

               {

                  if(s[cost[k]][k] < min)

                  {

                     min = s[cost[k]][k];

                     tmp = k;

                  }

               }

            }


            if(tmp == -1) break;


            tree[cost[tmp]][tmp] = tree[tmp][cost[tmp]] = s[cost[tmp]][tmp];

            visit[tmp] = degree;

            ans += s[cost[tmp]][tmp];


            for(int k = 1; k <= n; ++k)

            {

               if(k != tmp && visit[k] == 0 && s[k][tmp] != 0)

               {

                  if(cost[k] == 0)

                  {

                     cost[k] = tmp;

                  }

                  else if(s[k][tmp] < s[cost[k]][k])

                  {

                     cost[k] = tmp;

                  }

               }

            }


         }

      }

   }


   return ans;

}


0

阅读 收藏 喜欢 打印举报/Report
后一篇:Splay Tree
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有