1 /*
2 ACMer:MDK
3 2011,4,16
4 */
5 #include<stdio.h>
6 //#include<conio.h>
7 #include<iostream>
8
9 #include<string.h>
10 #include<math.h>
11
12 #include<vector>
13 #include<algorithm>
14 #include<set>
15 #include<map>
16 #include<stack>
17
18 #define MAXN 200
19 #define inf 1000000000
20
21 using namespace std;
22 typedef double elem_t;
23
24 typedef struct pair{
25
26 double x;
27 double y;
28 }P;
29 elem_t prim(int n,elem_t mat[][MAXN],int *pre)
30 {
31 elem_t min[MAXN],ret = 0;
32 int v[MAXN],i,j,k;
33 for(i = 0;i<n;i++)
34 {
35 min[i] = inf,v[i] = 0;pre[i] = -1;
36 }
37 for(min[j=0]=0;j<n;j++)
38 {
39 for(k = -1,i=0;i<n;i++)
40 {
41 if(!v[i]&&(k==-1||min[i]<min[k]))
42 {
43 k=i;
44 }
45 }
46 for(v[k]=1,ret+=min[k],i=0;i<n;i++)
47 {
48 if(!v[i]&&mat[k][i]<min[i])
49 min[i] = mat[pre[i]=k][i];
50 }
51
52 }
53 return ret;
54 }
55 int main()
56 {
57 int n,k=0;
58 cin>>n;
59 while(n)
60 {
61 k++;
62 double mat[MAXN][MAXN];
63 int pre[MAXN];
64 double min;
65 P a[MAXN];
66 for(int i =0;i<n;i++)
67 {
68 cin>>a[i].x>>a[i].y;
69 }
70 for(int i = 0;i<n;i++)
71 {
72 for(int j = 0;j<n;j++)
73 {
74 mat[i][j]=inf;
75 }
76 }
77 for(int i = 0;i<n;i++)
78 {
79 for(int j = 0;j<n;j++)
80 {
81 mat[i][j]=sqrt((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y));
82 //cout<<"mat"<<mat[i][j]<<endl;
83 }
84 }
85 min = prim(n,mat,pre);
86 printf("Case #%d:\nThe minimal distance is: %.2f\n",k,min);
87 cin>>n;
88 if(n)
89 cout<<endl;
90 }
91 }
A掉ZOJ的1203最小生成树。
水题,标准的水题!
直接一步prim就出来了,但是很纠结有个别人写的函数怎么也补不上参数了~