Hdu oj 1875 畅通工程再续

来源:互联网 发布:vb6 连接mysql数据库 编辑:程序博客网 时间:2024/05/14 17:00

题目:点击打开链接

分析:代码一为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;}elsereturn 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");elseprintf("%.1lf\n",sum*100);}return 0;}


代码二:

#include<stdio.h>#include<string.h>#include<math.h>#define INF 0xffffstruct 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;}elsereturn 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");elseprintf("%.1lf\n",sum*100);}return 0;}

0 0
原创粉丝点击