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

poj 2253 一条路径中的最大边 再找出最小的

时间:2015-06-21 18:21:14      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:

题目大意,有两只青蛙,分别在两个石头上,青蛙A想要到青蛙B那儿去,他可以直接跳到B的石头上,也可以跳到其他石头上,再从其他石头跳到B那儿,求青蛙从A到B的所有路径中最小的Frog Distance,我们定义Frog Distance为从A到B的一条路径中最大的一条边
假如点0到点1有3条路
第一条路径 会经过2个点 3条边 边的值为 1 4 3
第二条路径 一条边 5
第三条路径 1 3 2

那么 Frog Distance 分别为 4 5 3 则最终输出3

Sample Input

2
0 0
3 4

3
17 4
19 4
18 5

0
Sample Output

Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414

 

技术分享
 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # define LL long long
 7 using namespace std ;
 8 
 9 const int MAXN=300;
10 const double INF=0x3f3f3f3f;
11 int n ;
12 bool vis[MAXN];
13 double cost[MAXN][MAXN] ;
14 double lowcost[MAXN] ; //保存的是 起点到 i点 所有路径中 最大边中的 最小那条边的权值
15 
16 struct point
17 {
18     int x ;
19     int y ;
20 }p[MAXN];
21 
22 void Dijkstra(int beg)
23 {
24     for(int i=0;i<n;i++)
25     {
26         lowcost[i]=INF;vis[i]=false;
27     }
28     lowcost[beg]=0;
29     for(int j=0;j<n;j++)
30     {
31         int k=-1;
32         double Min=INF;
33         for(int i=0;i<n;i++)
34             if(!vis[i]&&lowcost[i]<Min)
35             {
36                 Min=lowcost[i];
37                 k=i;
38             }
39             if(k==-1)
40                 break ;
41             vis[k]=true;
42             for(int i=0;i<n;i++)
43                 if(!vis[i]&&max(lowcost[k],cost[k][i])<lowcost[i])
44                 {
45                     lowcost[i]=max(lowcost[k],cost[k][i]);
46                 }
47     }
48 
49 }
50 
51 double dis(point a,point b)
52 {
53     return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
54 }
55 
56 int main ()
57 {
58     //freopen("in.txt","r",stdin) ;
59     int iCase = 0 ;
60     while (scanf("%d" , &n ) ,n)
61     {
62         iCase++ ;
63         int u , v , w ;
64         int i , j ;
65         for (i = 0 ; i < n ; i++)
66             scanf("%d %d" , &p[i].x , &p[i].y) ;
67 
68         for (i = 0 ; i < n ; i++)
69         for (j = 0 ; j < n ; j++)
70        {
71            if (i == j)
72               cost[i][j] = 0 ;
73            else
74               cost[i][j] = dis(p[i],p[j]) ;
75        }
76         Dijkstra(0) ;
77         printf("Scenario #%d\nFrog Distance = ",iCase);
78         printf("%.3lf\n\n",lowcost[1]);
79 
80     }
81 
82     return 0 ;
83 }
View Code

 

poj 2253 一条路径中的最大边 再找出最小的

标签:

原文地址:http://www.cnblogs.com/-Buff-/p/4592216.html

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