好久不写prim了快忘了,这题就是说有N个城市,其中有一部分城市(M个)有手机(就假设是这个意思嘛ps:-),另外一部分城市有电话,两个有手机的城市不管有多远都能联系,而两个有电话的城市只有在一定的距离以内才能联系,问求这个距离的最小值;其实就是求一颗最小生成树,去掉生成树里的最大的M条边,剩下的最大的就是了:
prim:CODE:
---------
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct point
{
double x;
double y;
}alld[600];
double map[600][600];
double dist[600];
bool visited[600];
int Snum,Pnum;
double dis(double x,double y,double m,double n)
{
return sqrt((x-m)*(x-m)+(y-n)*(y-n));
}
void prim()
{
int in;
double min;
for (int i = 1;i <= Pnum;i++)
{
dist[i] = map[1][i];
visited[i] = false;
}
visited[1] = true;
for (int i = 1;i < Pnum;i++)
{
min = 1234567890;
for (int j = 2;j <= Pnum;j++)
{
if (!visited[j] && dist[j] < min)
{
min = dist[j];
in = j;
}
}
visited[in] = true;
dist[in] = min;
for (int j = 2;j <= Pnum;j++) if (!visited[j] && dist[j] > map[in][j]) dist[j] = map[in][j];
}
}
int main()
{
int casenum;
scanf("%d",&casenum);
while (casenum--)
{
scanf("%d %d",&Snum,&Pnum);
for (int i = 1;i <= Pnum;i++) scanf("%lf %lf",&alld[i].x,&alld[i].y);
for (int i = 1;i <= Pnum;i++)
{
for (int j = 1;j <= Pnum;j++)
{
map[i][j] = dis(alld[i].x,alld[i].y,alld[j].x,alld[j].y);
map[j][i] = map[i][j];
}
map[i][i] = 1234567890;
}
prim();
sort(dist+1,dist+Pnum+1);
printf("%.2lf/n",dist[Pnum-Snum]);
}
return 0;
}
-------------------------------
By: Debugcool