HDU 4463 Outlets 2012年亚洲区域赛杭州赛区现场赛K题

解题报告:

题目大意:在一座城市,一共有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 }
View Code

 

posted @ 2013-05-28 19:18  xiaxiaosheng  阅读(155)  评论(0编辑  收藏  举报