您的位置:首页 > 其它

hdu 1875 畅通工程再续(最小生成树,基础)

2014-01-16 10:40 465 查看
题目

让人郁闷的题目,wa到死了,必须要把判断10.0和1000.0的条件放到prim函数外面去。如代码所放。。。。

正确的(放在prim外):

//2个小岛之间的距离不能小于10米,也不能大于1000米,不能无视!

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

#define M 110
double mat[M][M];

struct tt
{
double x,y;
}dian[M];

double prim(int n,int sta)
{
double sum=0.0,dis[M];
int mark[M],i,j;
for(i=0;i<n;i++)
{
dis[i]=mat[sta][i];
mark[i]=0;
}
mark[sta]=1;
for(i=1;i<n;i++)
{
double minn=999999.0;
int flag=-1;
for(j=0;j<n;j++)
{
if(minn>dis[j]&&mark[j]==0&&dis[j]>=10.0&&dis[j]<=1000.0)//放在prim里面是wa的,虽然我不知道为什么
{
flag=j;
minn=dis[j];
}
}
if(flag==-1)
return -1.0;
else
{
mark[flag]=1;
sum+=dis[flag];
for(j=0;j<n;j++)
{
if(dis[j]>mat[flag][j])
dis[j]=mat[flag][j];
}
}
}
return sum;
}

int main()
{
int t,i,j,n;
double ans,a;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
mat[i][j]=999999.0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&dian[i].x,&dian[i].y);
for(j=0;j<i;j++)
{
a=sqrt((dian[i].x-dian[j].x)*(dian[i].x-dian[j].x)+(dian[i].y-dian[j].y)*(dian[i].y-dian[j].y));
mat[i][j]=mat[j][i]=a;
}
}
ans=prim(n,0);
if(ans<0)
printf("oh!\n");
else
printf("%.1lf\n",ans*100);

}
return 0;
}


错误的!

求知情人告诉我为什么放在里面就不行?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: