Total Submission(s): 39434 Accepted Submission(s): 13243
Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
Sample Input
2
2
10 10
20 20
3
1 1
2 2
1000 1000
Sample Output
1414.2
oh!
思路:模拟构造之前的数据。通过循环算出两两点之间的距离,然后符合的放进edge中,再对edge进行之前的相同操作即可了。。。
代码
kruskal算法,不懂的看前几篇
AC 62ms G++1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104/*
搞错地方了,应该是edge是n*(n-1)/2条
*/
using namespace std;
const int maxn=100;
int pre[maxn+3];
double ans;
int flag;
struct nNode
{
int x,y;
}zb[maxn+3];
struct Node
{
int st,to;
int w;
}edge[maxn*(maxn-1)/2+3];
bool cmp(Node a,Node b)
{
return a.w<b.w;
}
void init(int n)
{
for (int i=1;i<=n;i++) pre[i]=i;
}
int unionfind(int x)
{
int r=x;
while (pre[r]!=r)
{
r=pre[r];
}
int i=x,j;
while (pre[i]!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
int unionjoin(int x,int y)
{
int fx=unionfind(x),fy=unionfind(y);
if (fx!=fy)
{
pre[fx]=fy;
return 1;
}
return 0;
}
void kruskal(int n,int m)
{
int num=n-1;
ans=0;
flag=0;
for (int i=1;i<=m;i++)
{
if (unionjoin(edge[i].st,edge[i].to))
{
ans+=sqrt(edge[i].w)*100.0;
num--;
}
if (!num) return;
}
if (num) flag=1;
}
int main()
{
int t,n,m,a,b,c,cnt;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
init(n);
cnt=0;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&zb[i].x,&zb[i].y);
}
for (int i=1;i<=n;i++)
{
for (int j=i+1;j<=n;j++)
{
int nx=zb[i].x-zb[j].x;
int ny=zb[i].y-zb[j].y;
int m=nx*nx+ny*ny;
if (m>=100&&m<=1000000)
{
edge[++cnt].st=i;
edge[cnt].to=j;
edge[cnt].w=m;
}
}
}
sort(edge+1,edge+cnt+1,cmp);
kruskal(n,cnt);
if (!flag) printf("%.1f\n",ans);
else printf("oh!\n");
}
}