给出几个点的坐标,然后期中有几个点可以用手机通信,手机不论距离,剩余的用电话通信,问你最少需要用线的情况下最大的线路长度是多少
其实就是求出最小生成树以后,把最大的那几个点去掉用手机来通信,剩余的最大那个就是所有的
prim的基本应用
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include <algorithm>
5 using namespace std;
6 struct point
7 {
8 double x;
9 double y;
10 }alld[600];
11 double map[600][600];
12 double dist[600];
13 bool visited[600];
14 int Snum,Pnum;
15 double dis(double x,double y,double m,double n)
16 {
17 return sqrt((x-m)*(x-m)+(y-n)*(y-n));
18 }
19 void prim()
20 {
21 int in;
22 double min;
23 for(int i=1;i<=Pnum;i++)
24 {
25 dist[i]=map[1][i];
26 visited[i]=false;
27 }
28
29 for(int j=1;j<Pnum;j++)
30 {
31 min=99999999.0;
32 for(int i=2;i<=Pnum;i++)
33 if(dist[i]<min&&!visited[i])
34 {min=dist[i];in=i;}
35 visited[in]=true;
36 for(int i=2;i<=Pnum;i++)if(!visited[i]&&dist[i]>map[in][i])dist[i]=map[in][i];
37
38 }
39
40 }
41
42 int main()
43 {
44 int casenum;
45 scanf("%d",&casenum);
46 while (casenum--)
47 {
48 scanf("%d %d",&Snum,&Pnum);
49 for (int i = 1;i <= Pnum;i++) scanf("%lf %lf",&alld[i].x,&alld[i].y);
50 for (int i = 1;i <= Pnum;i++)
51 {
52 for (int j = 1;j <= Pnum;j++)
53 {
54 map[i][j] = dis(alld[i].x,alld[i].y,alld[j].x,alld[j].y);
55 map[j][i] = map[i][j];
56 }
57 map[i][i] = 1234567890;
58 }
59 prim();
60 sort(dist+1,dist+Pnum+1);
61 printf("%.2lf\n",dist[Pnum-Snum]);
62 }
63 return 0;
64 }