您的位置:首页 > 其它

ZOJ 1203 Swordfish ( prim )

2010-09-14 19:04 375 查看
我受不鸟最小生成树的题目了,怎么看着都这么水,难道是我挑的题水?

这个题我都没有去调试,编译成功之后就提交了,果然AC....

题中给出所有点的坐标,这样便可知道所有点之间的距离,用临界矩阵存,顺便用prim,水阿~

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
const double INF = 99999999;
double dist[101];
double mat[101][101];
int flag[101];
struct point
{
double x,y;
} a[101],t;
int main(void)
{
int n,i,j,now,start=1;
double min,sum;
while( scanf("%d",&n) && n )
{
for( i = 1; i <= n; i++ )
scanf("%lf%lf",&a[i].x,&a[i].y);
for( i = 1; i <= n; i++ )
for( j = 1; j <= n; j++ )
{
if( i==j ) mat[i][j] = 0;
else
{
mat[i][j] = sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)
+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
}
for( i = 1; i <= n; i++)
{
dist[i] = INF;
flag[i] = 0;
}
dist[now=1] = 0;
flag[1] =1;
for( i= 1,sum=0; i <n ;i++)
{
for( j = 1; j <= n; j++)
if( !flag[j] && dist[j] > mat[now][j] )
dist[j] = mat[now][j];
for( j = 1,min = INF; j <= n; j++)
if( !flag[j] && dist[j] < min )
min = dist[now = j];
flag[now]=1;
sum += min;
}
if( start == 1) printf("Case #%d:/n",start++);
else printf("/nCase #%d:/n",start++);
printf("The minimal distance is: %.2lf/n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: