问一题MST(最小生成树)的问题

kannaduki 2010-07-25 05:52:17
题目是UVA的10034
给不喜欢英文的人付翻译:

给你一些点的座标,把这些点用墨水画直线连起来,使得所有的点最后都连在一起。你的任务是写一个程式找出墨水画出的长度最小是多少?

Input
输入的第一列有一个整数,代表以下有几组测试资料。
每组测试资料的第1列有一个整数n(0< n <= 100),代表点的个数。接下来有n列代表这n个点的座标,每列有2个实数。
输入的第一列与第一组测试资料间空一列,各测试资料间亦空一列。请参考Sample Input

Output
对每一组测试资料输出墨水画出的长度最小是多少。测试资料间亦请空一列。

Sample Input
2

3
1.0 1.0
2.0 2.0
2.0 4.0

2
1.0 1.0
2.0 2.0

Sample Output
3.41

1.41

以下是我的代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 105
int n,p,i,j,parent[M];
/*
n=测资笔数
p=点的数目
parent=生成树上的父点
*/
double dis[M][M],point[M][2],d[M];
/*
dis[i][j]代表由i到j的距离
point[i][0],point[i][1]代表第i个点的x座标和y座标
d[i]代表i点到生成树上的最短距离
*/
bool visited[M],first=true;
//visited 判断有无访问过该点
//first 第一笔测资,判断presentation用
void get_dis()//求两点之间的距离(座标转换成距离)
{
for(i=0;i<p;i++)
{
dis[i][i]=0;
for(j=i+1;j<p;j++)
dis[i][j]=dis[j][i]=sqrt((point[i][0]-point[j][0])*(point[i][0]-point[j][0])+(point[i][1]-point[j][1])*(point[i][1]-point[j][1]));
}
}
double prim()//shortest spaning tree
{
double r=0;//生成树的总距离大小
memset(visited,false,sizeof(visited));
for(i=0;i<p;i++)d[i]=2*1e9;

d[0]=0;
parent[0]=0;

for(i=0;i<p;i++)
{
int a=-1,b=-1;
double min=2*1e9;
for(j=0;j<p;j++)
if(!visited[j]&&d[j]<min)
{
a=j;
min=d[j];
}
if(a==-1)break;
r+=min;
visited[a]=true;

for(b=0;b<9;b++)
if(!visited[b]&&dis[a][b]<d[b])
{
d[b]=dis[a][b];
parent[b]=a;
}
}
return r;
}
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%d",&p);
for(i=0;i<p;i++)scanf("%lf %lf",&point[i][0],&point[i][1]);
get_dis();
if(first)first=false;
else puts("");
printf("%.2lf\n",prim());
}
return 0;
}

以上,算法是prim算法
有试过Kruskal's Alogrithm就AC了
纯粹想了解有什么BUG(or测资)存在
先感谢各位牛人
...全文
125 点赞 收藏 3
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2010-07-26
for(b=0;b<9;b++)
回复
LeonTown 2010-07-26
[Quote=引用 2 楼 fancymouse 的回复:]
for(b=0;b<9;b++)
[/Quote]

for中应该改为b<p吧。。。
回复
低调走过 2010-07-25
友情帮顶
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告