ACM乐园
Love Me,Love My Code!
posts - 53,  comments - 24,  trackbacks - 0
求MST两种算法:Prim和Kruskal。Prim以点作为主体,Kruskal以边作为主体。
#include <iostream>
#include 
<cmath>

using namespace std;


const int M=101;
const double MAX=10000000;

struct S
{
    
double x,y;
}data[M];

double map[M][M];
double dis[M]; //存储i节点到当前节点的最短距离
int n;
double res; //结果

double d(S a,S b)
{
    
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void prim(int v)
{
    
int i,j,t;
    
double min;
    
for(i=1;i<=n;i++)
        dis[i]
=map[v][i];
    dis[v]
=0;        //标记已访问
    res=0;
    
for(t=1;t<n;t++//找点
    {
        min
=MAX;
        
for(i=1;i<=n;i++)
            
if(dis[i]<min && dis[i]!=0//找到未访问过的到当前节点最短的点
            {
                min
=dis[i];
                j
=i;
            }
        res
+=min;
        dis[j]
=0;
        
for(i=1;i<=n;i++)            //更新dis数组
            if(map[j][i]<dis[i])
                dis[i]
=map[j][i];
    }
}

int main()
{
    
int i,j;
    
while(scanf("%d",&n)!=EOF)
    {
        
for(i=1;i<=n;i++)
            scanf(
"%lf %lf",&data[i].x,&data[i].y);
        
for(i=1;i<=n;i++)
            
for(j=1;j<=n;j++)
                map[i][j]
=d(data[i],data[j]);
        prim(
1);
        printf(
"%.2lf\n",res);
    }
    
return 0;
}


posted on 2011-09-16 13:48 大大木马 阅读(239) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用链接

留言簿(1)

随笔档案(53)

文章档案(2)

搜索

  •  

积分与排名

  • 积分 - 62431
  • 排名 - 352

最新评论

阅读排行榜

评论排行榜