题目链接:https://vjudge.net/problem/POJ-2349

题意:

题目就是要我们找到一个最小的值D,把图里面所有大于D的边去掉之后剩余的连通分支的数量为S。这个就是找这个图里面最小生成树的第S大的边(也就是第n-S小的边),我们可以依照求最小生成树的过程来,首先对于每一个单点,我们把它看成一个点集,这样一开始我们有n个点集,然后我们找一条距离最小的边,合并边连接的两个点集,这样集合总数就变成了n-1个,假设我们要找一个最小的D,去掉大于D的边,使得连通分支数位n-1,那么这个最小D值就是最小的边的权值;依此类推,我们找到第二小的边(并且边连接两个点不在一个集合里面),连接边两边的点集,这样连通分支数就变成了n-2个,这条边的权值就是一个最小的D,去掉大于D后连通分支数变成了n-2个。然后我们要使得连通分支数为S,那么我们就找最小生成树里面第n-S小的边。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 1005
/*struct point{
    int u,w;
};
bool operator <(const point &s1,const point &s2)
{
    if(s1.w!=s2.w)
    return s1.w>s2.w;
    else
    return s1.u>s2.u;
}*/
];
struct EDGE{
    int u,v;
    double w;
}edge[];
struct node{
    double x,y;
}dot[];
double cal_dis(int a,int b){//去a,b两点距离
    return sqrt((dot[a].x-dot[b].x)*(dot[a].x-dot[b].x)+(dot[a].y-dot[b].y)*(dot[a].y-dot[b].y));
}
bool cmp(EDGE s1,EDGE s2){//排序
    return s1.w<s2.w;
}
int find(int a){
    if(pre[a]==a)
    return a;
    return pre[a]=find(pre[a]);
}
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&m,&n);
        ;i<=n;i++)
        scanf("%lf%lf",&dot[i].x,&dot[i].y);
        ;
        ;i<=n;i++)
        pre[i]=i;
        ;i<n;i++){
            ;j<=n;j++){
                ++cnt;
                edge[cnt].u=i;
                edge[cnt].v=j;
                edge[cnt].w=cal_dis(i,j);
            }
        }
        sort(edge+,edge+cnt+,cmp);
        double ans;
        m=n-m;
        ;m;i++){//找最小生成树里面第m小的边
            int u=edge[i].u;
            int v=edge[i].v;
            double w=edge[i].w;
            int x=find(u);
            int y=find(v);
            if(x!=y){
                m--;
                pre[x]=y;
                if(!m){
                    ans=w;
                    break;
                }
            }
        }
        printf("%.2lf\n",ans);
    }
    ;
}

poj 2349 求最小生成树里面第m长的边的更多相关文章

  1. Poj(2349),最小生成树的变形

    题目链接:http://poj.org/problem?id=2349 Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  2. poj 2485 求最小生成树中 最长的一条边

    Sample Input 1 //T 3 //n0 990 692 //邻接矩阵990 0 179692 179 0Sample Output 692 prim # include <iostr ...

  3. poj 2349 求MST中第S大的权值

    题目大意: 有一些炮台,如果这个炮台有卫星接收器,那么任意两个有卫星接收器的炮台可以通信,不受距离限制:否者,两个炮台之间只能通过对讲机通信,这是受距离限制的.要买一种对讲机,用在需要的炮台上,要求所 ...

  4. POJ 2395 Out of Hay(求最小生成树的最长边+kruskal)

    Out of Hay Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18472   Accepted: 7318 Descr ...

  5. poj 2349 Arctic Network(最小生成树的第k大边证明)

    题目链接: http://poj.org/problem?id=2349 题目大意: 有n个警戒部队,现在要把这n个警戒部队编入一个通信网络, 有两种方式链接警戒部队:1,用卫星信道可以链接无穷远的部 ...

  6. POJ 2349 Arctic Network (最小生成树)

    Arctic Network Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  7. POJ 2349 Arctic Network(最小生成树,第k大边权,基础)

    题目 /*********题意解说——来自discuss——by sixshine**************/ 有卫星电台的城市之间可以任意联络.没有卫星电台的城市只能和距离小于等于D的城市联络.题 ...

  8. (poj)1679 The Unique MST 求最小生成树是否唯一 (求次小生成树与最小生成树是否一样)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  9. POJ 1458 Common Subsequence(LCS最长公共子序列)

    POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

随机推荐

  1. 【mysql】工具使用

    mysql之workbench如何只导出(insert语句)数据 MySQL 编码:utf8 与 utf8mb4,utf8mb4_unicode_ci 与 utf8mb4_general_ci htt ...

  2. CSV表格融合

    常用表格融合函数 1 merge() 用于融合的函数 https://blog.csdn.net/brucewong0516/article/details/82707492 pd.merge(lef ...

  3. kafka原理和实践(四)spring-kafka消费者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  4. Mvc项目实例 MvcMusicStore 五

    Mvc项目实例 MvcMusicStore 一Mvc项目实例 MvcMusicStore 二Mvc项目实例 MvcMusicStore 三Mvc项目实例 MvcMusicStore 四Mvc项目实例 ...

  5. C# Interview Question 1

    What is C#? What's the feature of C# language? Answer:  

  6. Android jni中回调java的方法

    在上一篇的基础上,添加在C++代码中回调java方法. 代码如下: Demo.java 中添加callback函数, 打印一条log. package com.example.scarecrow.dy ...

  7. NFC应用于公交卡

    NFC应用于公交卡https://www.cnblogs.com/liuzhaoyzz/p/7115098.html 带有NFC功能的安卓手机可以给实体公交卡充值,手机虚拟公交卡现在有两种方案,一种是 ...

  8. sharepoint环境安装过程中几点需要注意的地方

    写在前面 上篇文章也说明了,在安装sharepoint环境的时候,确实吃了不少苦头,这里纪录一下安装过程中遇到的几个问题. 安装环境 windows server 2012 r2 standard x ...

  9. Rest API的简单应用

    写在前面 最近一直在搞通过Rest api的方式读取sharepoint文档库中的内容.有些地方需要注意,在此做下记录. 步骤 启动sharepoint服务器的服务 这里可以使用脚本的方式进行启动,脚 ...

  10. Chapter4 复杂度分析(下):浅析最好,最坏,平均,均摊时间复杂度

    四个复杂度分析: 1:最好情况时间复杂度(best case time complexity) 2:最坏情况时间复杂度(worst case time complexity) 3:平均情况时间复杂度( ...