POJ2349(求生成树中符合题意的边)

Arctic Network

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 14977   Accepted: 4777

Description

The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication technologies are to be used in establishing the network: every outpost will have a radio transceiver and some outposts will in addition have a satellite channel. 
Any two outposts with a satellite channel can communicate via the satellite, regardless of their location. Otherwise, two outposts can communicate by radio only if the distance between them does not exceed D, which depends of the power of the transceivers. Higher power yields higher D but costs more. Due to purchasing and maintenance considerations, the transceivers at the outposts must be identical; that is, the value of D is the same for every pair of outposts.

Your job is to determine the minimum D required for the transceivers. There must be at least one communication path (direct or indirect) between every pair of outposts.

Input

The first line of input contains N, the number of test cases. The first line of each test case contains 1 <= S <= 100, the number of satellite channels, and S < P <= 500, the number of outposts. P lines follow, giving the (x,y) coordinates of each outpost in km (coordinates are integers between 0 and 10,000).

Output

For each case, output should consist of a single line giving the minimum D required to connect the network. Output should be specified to 2 decimal points.

Sample Input

1
2 4
0 100
0 300
0 600
150 750

Sample Output

212.13题意及思路:有P个坐标,将P个坐标分为S组,求所有组的生成树的最大边中的最大边。求P个坐标构成的生成树,将边由大到小排序,第S条边即为所求。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=505*505;
const double INF=1.0e8;
typedef pair<double,int> P;
struct Point{
    int x,y,index;
}points[505];
struct Edge{
    int to,next;
    double cost;
}es[MAXN];
int V,E;
double dist(int x1,int y1,int x2,int y2)
{
    return sqrt((double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
}
bool comp(double a,double b)
{
    return a > b;
}
int head[505];
void add_edge(int u,int v,double cost)
{
    es[E].to=v;
    es[E].cost=cost;
    es[E].next=head[u];
    head[u]=E;
    E++;
}
int cnt;
double res[505];
double d[505];
int vis[505];
void prim(int s)
{
    for(int i=1;i<=V;i++)
    {
        d[i]=INF;
        vis[i]=0;
    }
    d[s]=0;
    cnt=0;
    priority_queue<P,vector<P>,greater<P> > que;
    que.push(P(0,s));
    while(!que.empty())
    {
        P now=que.top();que.pop();
        int v=now.second;
        if(vis[v])    continue;
        res[cnt++]=now.first;
        vis[v]=1;
        for(int i=head[v];i!=-1;i=es[i].next)
        {
            Edge e=es[i];
            if(d[e.to]>e.cost)
            {
                d[e.to]=e.cost;
                que.push(P(d[e.to],e.to));
            }
        }
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    int S,P;
    while(T--)
    {
        scanf("%d%d",&S,&P);
        memset(head,-1,sizeof(head));
        V=P;
        E=0;
        for(int i=0;i<P;i++)
        {
            scanf("%d%d",&points[i].x,&points[i].y);
            points[i].index=i+1;
        }
        for(int i=0;i<P;i++)
            for(int j=i+1;j<P;j++)
            {
                int indi=points[i].index;
                int indj=points[j].index;
                double co=dist(points[i].x,points[i].y,points[j].x,points[j].y);
                add_edge(indi,indj,co);
                add_edge(indj,indi,co);
            }    

        prim(1);
        sort(res,res+cnt,comp);
        printf("%0.2lf\n",res[S-1]);
    }

    return 0;
}
时间: 2024-10-10 11:10:16

POJ2349(求生成树中符合题意的边)的相关文章

[ jquery 过滤器 parent(expr) ] 此方法用于在选择器的基础之上搜索被选元素中符合表达式的父元素

此方法用于在选择器的基础之上搜索被选元素中符合表达式的父元素 取得一个包含着所有匹配元素的唯一父元素的元素集合,你可以使用可选的表达式来筛选: 实例: <html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my page'> <meta http-equiv='keywords' c

用C#通过正则表达式截取字符串中符合条件的子字符串

仅仅作为简单的记录,不多说直接上代码(仅测试使用): private void Test() { Regex ConnoteA = new Regex("^[a-zA-Z]\\d{8}$"); Regex ConnoteAA = new Regex("^[a-zA-Z]{2}\\d{7,10}$"); Regex ConnoteAAA = new Regex("^[a-zA-Z]{3}\\d{5,9}$"); Regex ConnoteAAAA

取得left join的第二表中符合条件的第一条记录

问题描述 有表一 tableA tid     username     title 1         lily       我公司将进行xx培训 2        angus      关于秋游的通知 3        boss       这个月不发奖金 4        vivi       新产品上市 表二 tableB tid      time     txt 1        0809    大家快来.... 2        0810    我是新来的,大家好 2       

《Linux学习并不难》Linux常用操作命令(14):grep命令查找文件中符合条件的字符串

8.14  <Linux学习并不难>Linux常用操作命令(14):grep命令查找文件中符合条件的字符串 使用grep命令可以查找文件内符合条件的字符串.          命令语法: grep [选项] [查找模式] [文件] 命令中各选项的含义如表所示. 选项 选项含义 -E 模式是一个可扩展的正则表达式 -F 模式是一组由断行符分隔的定长字符串 -P 模式是一个Perl正则表达式 -b 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量 -c 只显示匹配行的数量 -i 比较时不

exp导出一个表中符合查询条件的数据

原文地址:exp导出一个表中符合查询条件的数据 作者:charsi 导出一个表中的部分数据,使用QUERY参数,如下导出select * from test where object_id>50000这个条件中的数据exp charsi/[email protected] tables=(TEST) query="'where object_id>50000'" file=aaa.dmp log=aaa.log 其他参数含义:GRANTS:指定是否导出对象的授权信息,默认参

左神算法书籍《程序员代码面试指南》——3_08找到二叉树中符合搜索二又树条件的最大拓扑结构【***】

[题目]给定一棵二叉树的头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小. [题解] 方法一:二叉树的节点数为N,时间复杂度为O(N2)的方法. 首先来看这样一个问题,以节点h为头的树中,在拓扑结构中也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构?这个问题有一种比较容易理解的解法,我们先考查h的孩子节点,根据孩子节点的值从h开始按照二叉搜索的方式移动,如果最后能移动到同一个孩子节点上,说明这个孩子节点可以作为这个拓扑的一部分,并继续考

找出数组a[]中符合a[i]+a[j]=K的数对

1.问题描述 在一个整数数组中,元素都为整数,没有重复数.设计一个算法找出满足两个数的和等于k值得数对.例如a[]={1,3,8,6,4}中两个数的和为7的数对为(1,6)和(3,4). 2. 解决方案 2.1 暴力法 首先先到的可能就是暴力法,暴力没举出所有的数对然后再判对他们的和是否为K,但这种方法的时间复杂度为O(n^2),效率比较低,一般不可取.代码也就不写了.. 2.2 二分法 先对数组进行排序,然后使用二分查找算法,使用两个指针分片指向第一个和最后一个元素,然后从两端同时向中间遍历.

POJ-2485 Highways---最小生成树中最大边

题目链接: https://vjudge.net/problem/POJ-2485 题目大意: 求最小生成树中的最大边 思路: 是稠密图,用prim更好,但是规模不大,kruskal也可以过 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #in

dp - 求符合题意的序列的个数

The sequence of integers a1,a2,-,ak is called a good array if a1=k?1 and a1>0. For example, the sequences [3,?1,44,0],[1,?99] are good arrays, and the sequences [3,7,8],[2,5,4,1],[0] - are not. A sequence of integers is called good if it can be divid