您的位置:首页 > 其它

Hdu oj 1875 畅通工程再续

2015-08-12 20:23 239 查看
题目:点击打开链接

分析:代码一为AC的代码,代码二为自己在代码一的基础上优化的代码,测试多种结果都正确,但是确不能AC,后来发现,优化之后,出现了问题。

代码一:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct stu
{
int x,y;
double d;
}a1[10000];
struct stl
{
int x,y;
}a2[110];
int per[10000];
int a;
void init()//初始化函数
{
int i;
for(i=0;i<=a;i++)
per[i]=i;
}
int find(int x)
{
if(x==per[x])
return x;
return per[x]=find(per[x]);
}
bool join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
{
per[fx]=fy;
return true;
}
else
return false;
}
double ds(int x1,int x2,int y1,int y2)
{
double a=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
return sqrt(a);
}
int cmp(stu x,stu y)
{
return x.d<y.d;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j,k;
double sum=0,distance=0;
scanf("%d",&a);
for(i=0;i<a;i++)
scanf("%d%d",&a2[i].x,&a2[i].y);
init();
k=0;
for(i=0;i<a;i++) //存编号
for(j=i+1;j<a;j++)
{
distance=ds(a2[i].x,a2[j].x,a2[i].y,a2[j].y);//注意别把下标搞错了。
a1[k].x=i;
a1[k].y=j;
a1[k].d=distance;
k++;
}
sort(a1,a1+k,cmp);
for(i=0;i<k;i++)
{
if(a1[i].d>=10&&a1[i].d<=1000&&join(a1[i].x,a1[i].y))
sum+=a1[i].d;
}
k=0;
for(i=1;i<a;i++)//如果联通只存在一个父节点
{
if(find(i)!=find(i-1))
k=1;
}
if(k)
printf("oh!\n");
else
printf("%.1lf\n",sum*100);
}
return 0;
}


代码二:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define INF 0xffff
struct stu
{
int x,y;
double d;
int link;
}a1[110];
int per[110];
int a;
void init()
{
int i;
for(i=1;i<=a;i++)
{
per[i]=i;
a1[i].d=INF;
a1[i].link=0;
}
}
int find(int x)
{
if(x==per[x])
return x;
return per[x]=find(per[x]);
}
bool join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
{
per[fx]=fy;
return true;
}
else
return false;
}
double ds(int x1,int x2,int y1,int y2)
{
double a=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
return sqrt(a);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j,k;
double sum=0,distance=0;
scanf("%d",&a);
for(i=1;i<=a;i++)
scanf("%d%d",&a1[i].x,&a1[i].y);
init();
for(i=1;i<=a;i++)//与代码一不同的是,连接的时候,确保每一次最短的相连,但是确不能确保把所有的点都连接起来。
{
for(j=1;j<=a;j++)
{
if(j!=i)
{
distance=ds(a1[i].x,a1[j].x,a1[i].y,a1[j].y);
if(distance>1000||distance<10)
distance=INF;
if(a1[i].d>distance)
{
a1[i].d=distance;
a1[i].link=j;
}
}
}
}
k=0;
for(i=1;i<=a;i++)
{
if(a1[i].link!=0)
if(join(i,a1[i].link))
sum+=a1[i].d;
}
for(i=2;i<=a;i++)
{
if(find(i)!=find(i-1))
k=1;
}
if(k)
printf("oh!\n");
else
printf("%.1lf\n",sum*100);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: