hdu 1162 Eddy's picture

http://acm.hdu.edu.cn/showproblem.php?pid=1162  最小生成树 prim算法 

View Code
 1 //*最小生成树,prim算法*/
2 #include<iostream>
3 #include<cstring>
4 #include<cmath>
5 #include<cfloat>//DBL_MAX
6 #include<iomanip>
7 using namespace std;
8 struct node
9 {
10 double x,y;
11 };
12 node point[108];
13 double dis[108];
14 bool visited[108];
15 int n;
16 int find()
17 {
18 double minx=DBL_MAX;
19 int pos=-1;
20 for(int i=0;i<n;i++)
21 if(!visited[i] && dis[i]<minx) minx=dis[i],pos=i;
22 return pos;
23 }
24 void prim(int v0)//从point[v0]开始
25 {
26 int i,j;
27 for(i=0;i<n;i++)
28 {
29 dis[i]=sqrt(pow(point[i].x-point[v0].x,2.0)+pow(point[i].y-point[v0].y,2.0));
30 visited[i]=false;
31 }
32 visited[v0]=true;
33 double sum=0;
34 for(i=0;i<n-1;i++)//添加n-1个点到生成树中
35 {
36 int pos=find();
37 visited[pos]=true;
38 sum+=dis[pos];
39 //cout<<"sum:"<<sum<<endl;
40 for(j=0;j<n;j++)//更新
41 {
42 double temp=sqrt(pow(point[pos].x-point[j].x,2.0)+pow(point[pos].y-point[j].y,2.0));
43 if(!visited[j] && temp<dis[j]) dis[j]=temp;
44 }
45 }
46 cout.precision(2);
47 cout<<fixed<<sum<<endl;
48 }
49 int main()
50 {
51 while(cin>>n)
52 {
53 int i;
54 for(i=0;i<n;i++) cin>>point[i].x>>point[i].y;
55 prim(0);//from point[0]
56 }
57 return 0;
58 }


 

posted @ 2012-03-29 21:10  keepmoving89  阅读(155)  评论(0编辑  收藏  举报