标签:
题目:点击打开链接
分析:代码一为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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zm_11/article/details/47450279