# P1991 无线通讯网

• 170通过
• 539提交
• 题目提供者洛谷OnlineJudge
• 标签图论
• 难度普及+/提高

## 最新讨论

• 怎么又炸了
• 为啥一直40！求解！
• UKE:invalid input file
• UKE Invalid Input File
• 未知错误
• 编译器不对

(x, y)，以 km 为单位。

## 输入输出样例

2 4
0 100
0 300
0 600
150 750


212.13


## 说明

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int fa[1010], n, m,x[1010],y[1010];
double ans;

struct node
{
int a, b;
double c;
}e[500010];

bool cmp(node x,node y)
{
return x.c < y.c;
}

int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}

int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
scanf("%d%d", &x[i], &y[i]);
int cnt = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m;j++)
{
if (i != j)
{
cnt++;
e[cnt].a = i;
e[cnt].b = j;
e[cnt].c = sqrt((double)(x[i] - x[j])*(x[i] - x[j]) + (double)(y[i] - y[j])*(y[i] - y[j]));
}
}
sort(e + 1, e + cnt + 1, cmp);
for (int i = 1; i <= m; i++)
fa[i] = i;
int tot = 0;
for (int i = 1; i <= cnt; i++)
{
int q = find(e[i].a), p = find(e[i].b);
if (q != p)
{
tot++;
ans = e[i].c;
fa[q] = p;
}
if (tot>= m - n)
break;
}
printf("%.2lf", ans);

return 0;
}

posted @ 2016-08-23 19:45 zbtrs 阅读(...) 评论(...) 编辑 收藏