POJ

来源:互联网 发布:mac上装ios模拟器 编辑:程序博客网 时间:2024/06/01 10:44

贴模板
有卫星的两个点之间随意通信。没有卫星的点之间距离不超过D可以通信。求最小D。
没有卫星的情况下,用kruskal建一课最小生成树时,会对边进行排序。这时边的最大值就是答案。有卫星的情况下,让距离最大的点拥有卫星,s个卫星使用了s-1个边。第 总边数减去s-1 个边就是要求的最小D。

#include <stdio.h>#include <string.h>#include <iostream>#include<algorithm>#include <vector>#include <queue>#include <string>#include <math.h>#include <stdlib.h>using namespace std;#define INF 0x3f3f3f3f#define mem(arr,a) memset(arr,a,sizeof(arr))#define V 1000+5#define LL long long int#define E 320000#define pow(a) ((a)*(a))struct node{    int x, y;};struct edge{    int u, v;double w;};bool cmp(edge a, edge b){    return a.w < b.w;}edge es[E];node vet[V];int t, s, n;int par[V];int cnt = 0;int find(int x){    if (x == par[x])return par[x];    return par[x] = find(par[x]);}void kruskal(){    sort(es, es + cnt, cmp);    int c = 0;    for (int i = 0; i < cnt; i++){        edge e = es[i];        int a = find(e.u);        int b = find(e.v);        if (a != b){            par[a] = b;            c++;            if (c == n - s){                printf("%.2f\n", e.w);                return;            }        }    }}int main(){    cin >> t;    while (t--){        cin >> s >> n;        for (int i = 1; i <= n; i++)par[i] = i;        cnt = 0;        for (int i = 1; i <= n; i++){            cin >> vet[i].x >> vet[i].y;        }        for (int i = 1; i <= n; i++){            for (int j = 1; j < i; j++){                es[cnt].u = i;                es[cnt].v = j;                es[cnt++].w = sqrt(pow(vet[i].x - vet[j].x) + pow(vet[i].y - vet[j].y));            }        }        kruskal();    }}
原创粉丝点击