poj 2349 Arctic Network (prim)

 好久不写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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值