[kuangbin带你飞]专题六 最小生成树 G POJ 2349

来源:互联网 发布:微软软件正版化 编辑:程序博客网 时间:2024/05/28 18:44

题目地址:https://vjudge.net/contest/66965#problem/G

思路:相当于求最小生成树的第p-s条边。

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int maxn=500+10;int t,s,p;struct pos{    int x,y;    double z;}E[maxn*maxn];struct point{    int x,y;}a[maxn];int fa[maxn];int find(int p){    if(p!=fa[p])        fa[p]=find(fa[p]);    return fa[p];}bool cmp(pos a,pos b){    return a.z<b.z;}double get(int i,int j){    return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&s,&p);        for(int i=1;i<=p;i++)            scanf("%d%d",&a[i].x,&a[i].y);        int m=0;        for(int i=1;i<=p;i++)            for(int j=i+1;j<=p;j++)        {            double temp=get(i,j);            E[m].x=i,E[m].y=j,E[m++].z=temp;        }        sort(E,E+m,cmp);        for(int i=0;i<=p;i++)            fa[i]=i;        int ans,sum=0;        for(int i=0;i<m;i++)        {            int x=E[i].x;            int y=E[i].y;            int fx=find(x);            int fy=find(y);            if(fx!=fy)            {                fa[fx]=fy;                sum++;                if(sum==p-s)                {                    printf("%.2f\n",E[i].z);                    break;                }            }        }    }}


0 0