想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第一个和第二个坐标,现在A青蛙想要到B青蛙那里去,并且A青蛙可以借助任意石头的跳跃,而从A到B有若干通路,问从A到B的所有通路上的最大边
解题思路:一个简单的最短路径变形,只要将d[i]的意义变为从1到i的最大边即可,然后修改下更新条件就可以了
- /*
- 192K 16MS
- */
- #include
- #include
- #define inf 1e8
- #define MAXV 210
- #define max(a,b) (a>b?a:b)
-
- typedef struct{
- int x,y;
- }Point;
-
- Point point[MAXV];
- double d[MAXV];
- int n;
-
- double distance(Point a,Point b){
- return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
- }
-
- void dijkstra(){
- int i,j,vis[MAXV],v=1;
- double min;
- for(i=1;i<=n;i++){
- d[i]=inf;
- vis[i]=0;
- }
- d[1]=0;
- for(i=1;i<=n;i++){
- min=inf;
- for(j=1;j<=n;j++)
- if(!vis[j] && d[j]
- min=d[j];
- v=j;
- }
- vis[v]=1;
- if(v==2) break;
- for(j=1;j<=n;j++)
- if(!vis[j] && d[j]>max(d[v],distance(point[v],point[j]))){
- d[j]=max(d[v],distance(point[v],point[j]));
- }
- }
- }
-
- int main(){
- int i,cnt=1;
- while(scanf("%d",&n) && n){
- for(i=1;i<=n;i++) scanf("%d%d",&point[i].x,&point[i].y);
- dijkstra();
- printf("Scenario #%d\nFrog Distance = %.3lf\n\n",cnt++,d[2]);
- }
- return 0;
- }
注:本文转载自blog.csdn.net的wangjian8006的文章"http://blog.csdn.net/wangjian8006/article/details/7871812"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
评论记录:
回复评论: