Description
国防部(DND)要用无线网络连接北部几个哨所。两种不同的通信技术被用于建立网络:每一个哨所有一个无线电收发器,一些哨所将有一个卫星频道。
任何两个有卫星信道的哨所可以通过卫星进行通信,而不管他们的位置。同时,当两个哨所之间的距离不超过D时可以通过无线电通讯,D取决于对收发器的功率。功率越大,D也越大,但成本更高。出于采购和维修的方便,所有哨所的收发器必须是相同的;那就是说,D值对每一个哨所相同。
你的任务是确定收发器的D的最小值。每对哨所间至少要有一条通信线路(直接或间接)。
Input
输入的第一行是测试数据的数量N。
每组测试数据的第一行包含卫星频道的数量S(1 < = S < = 100)和哨所的数量P(S < P < = 500)。接下来的P行,给出以公里为单位的每个哨所的坐标(x,y)( 坐标为0到10000之间的整数)。
Output
对于每组测试数据,输出一行,输出收发器的D的最小值。精确到小数点后两位。
Sample Input
1 2 4 0 100 0 300 0 600 150 750
Sample Output
212.13
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<iostream> using namespace std; #define N 2005 #define Max 0x3f3f3f3f int maps[N][N],dis[N], vis[N]; char maps1[N][20]; int Dist(int x, int y) { int count=0; for(int i=0;i<7;i++) { if(maps1[x][i]!=maps1[y][i]) count++; } return count; } int prim(int n) { int i, j, pos, Min, sum=0; memset(vis, 0, sizeof(vis)); vis[1]=1; pos=1; for(i=1;i<=n;i++) { dis[i]=maps[i][1]; } for(i=1;i<n;i++) { Min=Max; for(j=1;j<=n;j++) { if(!vis[j] && dis[j]<Min) { Min=dis[j]; pos=j; } } sum+=Min; vis[pos]=1; for(j=1;j<=n;j++) { if(!vis[j] && dis[j]>maps[pos][j]) { dis[j]=maps[pos][j]; } } } return sum; } int main() { int i, j, s, n; while(scanf("%d",&n), n) { for(i=1;i<=n;i++) { scanf("%s",maps1[i]); } for(i=1;i<n;i++) { for(j=i+1;j<=n;j++) { maps[i][j]=maps[j][i]=Dist(i, j); } } s=prim(n); printf("The highest possible quality is 1/%d.\n",s); } return 0; }