您的位置:首页 > 其它

【POJ】[2349]Arctic Network

2016-02-21 00:47 274 查看


理解题意之后也并不算太难

大意是给了一些坐标来求最小生成树

然而让输出的是最大边的值,而因为还有卫星可供通讯

所以只需要当有P个点S个卫星时

共P-1条边里舍去S-1条大的边

所以这里我感觉用Kruskal更好一些

而且当取了

P-1-(S-1)==P-S条边时,这一条边便是所要求边

不需要进行后续操作了

[code]#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

struct edge {
    int u,v;
    double dis;
} e[250200];

int par[520];
int ran[520];

int find(int m) {
    if(m==par[m])
        return m;
    else
        return par[m]=find(par[m]);
}
void unite(int x,int y) {
    x=find(x);
    y=find(y);
    if(x==y)
        return;
    if(ran[x]<ran[y])
        par[x]=y;
    else {
        par[y]=x;
        if(ran[x]==ran[y])
            ran[x]++;
    }
}
bool cmp(edge A,edge B) {
    return A.dis<B.dis;
}

struct xy {
    double x,y;
} x[520];
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        int S,N;
        scanf("%d %d",&S,&N);
        for(int i=1; i<=N; i++) {
            par[i]=i;
            ran[i]=0;
        }
        for(int i=1; i<=N; i++) {
            scanf("%lf %lf",&x[i].x,&x[i].y);
        }
        int cnt=-1;
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=N; j++) {
                if(i==j)
                    continue;
                e[++cnt].u=i;
                e[cnt].v=j;
                e[cnt].dis=sqrt(pow(x[i].x-x[j].x,2)+pow(x[i].y-x[j].y,2));
            }
        }
        sort(e,e+cnt+1,cmp);
        double sum=0;
        int res=0;
        for(int i=0; i<=cnt; i++) {
            if(find(e[i].u)!=find(e[i].v)) {
                res++;
                if(res==N-S) {
                    printf("%.2lf\n",e[i].dis);
                    break;
                }
                unite(e[i].u,e[i].v);
            }
        }
    }
    return 0;
}


题目地址:【POJ】[2349]Arctic Network
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: