解题报告:
题目大意:在一座城市,一共有N家店,其中有一家苹果店和一家耐克店,现在要在这些店之间线路,要使所有的店都联通,并规定苹果店和耐克店之间必须有一条直接的线路,
求要修建的路的总长度最小是多少?
最小生成树题,感觉这题用普莱姆算法比较好,先把苹果店和耐克店初始化到一个集合里面去,接下来就是纯最小生成树了。
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 int visit[110],N,p,q; 5 double map[110][110],local[110][2],sum; 6 double len(double x1,double y1,double x2,double y2) { 7 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 8 } 9 int main() { 10 int th=1; 11 while(scanf("%d",&N)&&N!=0) { 12 scanf("%d%d",&p,&q); 13 sum=0; 14 for(int i=1;i<=N;++i) 15 scanf("%lf%lf",&local[i][0],&local[i][1]); 16 for(int i=1;i<=N;++i) 17 for(int j=1;j<=N;++j) 18 map[i][j]=len(local[i][0],local[i][1],local[j][0],local[j][1]); 19 memset(visit,0,sizeof(visit)); 20 visit[p]=visit[q]=1; 21 sum+=map[p][q]; 22 for(int i=2;i<N;++i) { 23 double min=999999; 24 int local1,local2; 25 for(int j=1;j<=N;++j) 26 if(visit[j]==0) { 27 for(int k=1;k<=N;++k) 28 if(visit[k]==1&&map[j][k]<min) { 29 min=map[j][k]; 30 local1=j; 31 local2=k; 32 } 33 } 34 visit[local1]=visit[local2]=1; 35 sum+=map[local1][local2]; 36 } 37 printf("%.2lf\n",sum); 38 } 39 return 0; 40 }