畅通工程再续_MST(hdu 1875)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875

Problem Description

相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。

Input

输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。 每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。

Output

每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.

题目分析:当两点之间的距离,大于1000 或者 小于10 的时候设置两点之间的距离为MAX .

关键代码:

初始化
 1 for(i = 1 ; i <= n ; ++i)
 2         {
 3             for(j = 1 ; j <= n ; ++j)
 4             {
 5                 if(i == j)
 6                     path[i][j] = 1 ;
 7                 else
 8                     path[i][j] = 0 ;
 9                 dist[i][j] = MAX ;
10             }
11             scanf("%d%d" , &pt[i].x , &pt[i].y) ;
12         }
13         for(i = 1 ; i <= n ; ++i)
14         {
15             for(j = 1 ; j <= n ; ++j)
16             {
17                 if(!path[i][j])
18                 {
19                     tmp = getDist(pt[i].x , pt[i].y , pt[j].x , pt[j].y) ;
20                     if(tmp >= 10 && tmp <= 1000)
21                         dist[i][j] = tmp ;
22                     else
23                         dist[i][j] = MAX ;
24                     path[i][j] = 1 ;
25                 }
26             }
27         }

这样就可以直接的运用prim算法了!!

代码如下:

View Code
 1 #include
 2 #include
 3 #include
 4 using namespace std ;
 5 #define N 102 
 6 #define MAX 1500*1.0
 7 double dist[N][N] ; 
 8 int path[N][N] ;
 9 int visit[N] ; 
10 double lowCost[N] ;
11 struct POINT
12 {
13     int x , y ;
14 }pt[N] ;
15 
16 double getDist(int x1 , int y1 , int x2 , int y2)
17 {
18     return sqrt(1.0*((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))) ;
19 }
20 int main(void)
21 {
22     int lines ;
23     scanf("%d" , &lines) ; 
24     while(lines--)
25     {
26         int i , j , n , iPos ;
27         double min , ans = 0.0 , tmp ;
28         scanf("%d" , &n) ;
29         for(i = 1 ; i <= n ; ++i)
30         {
31             for(j = 1 ; j <= n ; ++j)
32             {
33                 if(i == j)
34                     path[i][j] = 1 ;
35                 else
36                     path[i][j] = 0 ;
37                 dist[i][j] = MAX ;
38             }
39             scanf("%d%d" , &pt[i].x , &pt[i].y) ;
40         }
41         for(i = 1 ; i <= n ; ++i)
42         {
43             for(j = 1 ; j <= n ; ++j)
44             {
45                 if(!path[i][j])
46                 {
47                     tmp = getDist(pt[i].x , pt[i].y , pt[j].x , pt[j].y) ;
48                     if(tmp >= 10 && tmp <= 1000)
49                         dist[i][j] = tmp ;
50                     else
51                         dist[i][j] = MAX ;
52                     path[i][j] = 1 ;
53                 }
54             }
55         }
56         for(i = 1 ; i <= n ; ++i)
57         {
58             visit[i] = 0 ; 
59             lowCost[i] = dist[i][1] ;
60         }
61         visit[1] = 1 ; 
62         for(i = 1 ; i <= n ; ++i)
63         {
64             min = MAX ; 
65             iPos = 1 ; 
66             for(j = 2 ; j <= n ; ++j)
67             {
68                 if(!visit[j] && min > lowCost[j])
69                 {
70                     min = lowCost[j] ; 
71                     iPos = j ;
72                 }
73             }
74             if(iPos == 1)
75                 break ; 
76             visit[iPos] = 1 ; 
77             ans += min ;
78             for(j = 2 ; j <= n ; ++j)
79             {
80                 if(!visit[j] && dist[j][iPos] < lowCost[j])
81                     lowCost[j] = dist[j][iPos] ;
82             }
83         }
84         for(i = 1 ; i <= n ; ++i)
85         {
86             if(!visit[i])
87                 break ;
88         }
89         if(i == n+1)
90             printf("%.1lf\n" , ans*100) ;
91         else
92             printf("oh!\n") ;
93     }
94     return 0 ;
95 }

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/CqlLiliang/archive/2012/07/05/2578343.html

你可能感兴趣的:(畅通工程再续_MST(hdu 1875))