码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1875 畅通工程再续 prim模板题

时间:2016-04-27 22:39:11      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

B - 畅通工程再续
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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!
 
注意while(t--)时,最后会是-1,傻逼的突然被这卡住了,硬是纠结了1小时。
主要是理解如何对这些点求距离,条件10《=l<=1000。当不再此条件时,便不可以建树。
技术分享
 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 using namespace std;
 5 #define INF 999999999
 6 int n;
 7 int x[110],y[110],visit[110];
 8 double map[110][110],dis[110];
 9 double w(int i,int j)
10 {
11     return sqrt(1.0*((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
12 }
13 void input()
14 {
15     int i,j;
16     double l;
17     scanf("%d",&n);
18     for(i=1;i<=n;i++)
19     scanf("%d%d",&x[i],&y[i]);
20     for(i=1;i<=n;i++)
21     for(j=1;j<=n;j++)
22     {
23         l=w(i,j);
24         if(l>=10&&l<=1000)
25     map[i][j]=map[j][i]=l;
26     else
27     map[i][j]=map[j][i]=INF;
28 }
29     return;
30 }
31 void prim()
32 {
33     int t=n,i,j,pos;
34         for(int i=2;i<=n;i++)
35     {
36         visit[i]=0;
37         dis[i]=map[i][1];
38     }
39     visit[1] = 1;
40     double sum=0,temp;
41     while(t--)
42     {
43          temp=INF;
44         for(int j=1;j<=n;j++)
45         {
46             if(!visit[j]&&dis[j]<temp)
47             {
48                 temp=dis[j];
49                 pos=j;
50             }
51         }
52         if(temp==INF)break;
53         visit[pos]=1;
54         sum+=dis[pos];
55         for(int j=1;j<=n;j++)
56         {
57             if(!visit[j]&&dis[j]>map[pos][j])
58                 dis[j]=map[pos][j];
59         }
60     }
61        if(t==0)
62     {
63         printf("%.1f\n",sum*100);
64     }
65     else printf("oh!\n");
66 }
67 main()
68 {
69     int T;
70     scanf("%d",&T);
71     while(T--)
72     {
73         input();
74         prim();
75     }
76 }
View Code

 

HDU 1875 畅通工程再续 prim模板题

标签:

原文地址:http://www.cnblogs.com/CrazyBaby/p/5440445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!