zoukankan      html  css  js  c++  java
  • 弗洛伊德思想题目

    湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。

    Input

    多实例输入
    先输入一个整数n表示石头数量,当n等于0时结束。
    接下来2-n+1行依次给出编号为1到n的石头的坐标xi , yi。
    2 <= n <= 200
    0 <= xi , yi <= 1000

    Output

    先输出"Scenario #x", x代表样例序号。
    接下来一行输出"Frog Distance = y", y代表你得到的答案。
    每个样例后输出一个空行。
    (ps:wa有可能是精度问题,g++不对可以用c++尝试,都不对就是代码问题)

    Sample Input

    2
    0 0
    3 4
    
    3
    17 4
    19 4
    18 5
    
    0
    

    Sample OutputScenario #1

    Frog Distance = 5.000
    
    Scenario #2
    Frog Distance = 1.414
    



    题解:
    该题所给相当于石头坐标,求两点间的距离,即求出三角形的最长边,然后在这些边中求最短路;
    //因为是坐标,两点间距离为三角形最长边,求出所有最长边的最小值 
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define inf 1e18
    #include<algorithm>
    #include<cmath>
    using namespace std ;
    int n;
    int w[250][250],dis[250];  //w数组记录i-j的距离 ,dis数组记录并更新 
    bool vis[250];   //标记作用, 
    
    struct node 
    { 
      int x;
      int y;
    }p[250];
    
    double dist(node a,node b)
    {
        return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    }
    
    void dijkstra()  //核心代码
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
           dis[i]=w[1][i]; //初始化dis数组,1到各个顶点的距离
        for(int i=1;i<=n;i++)
        {
            int u,m=inf;
            for(int j=1;j<=n;j++)
             if(!vis[j]&&dis[j]<=m)
                m=dis[u=j];
            vis[u]=1;
            for(int j=1;j<=n;j++)
           {
              int k=max(dis[u],w[u][j]);
              dis[j]=min(k,dis[j]);
           } 
        }
    } 
    int main()
    {
        int q=1;
        while(cin>>n)
        {
            if(n==0)break;
            for(int i=1;i<=n;i++)
               cin>>p[i].x>>p[i].y;
            for(int i=1;i<=n;i++)
               for(int j=1;j<=n;j++)
                w[i][j]=dist(p[i],p[j]);
            dijkstra();
            cout<<"Scenario #"<<q++<<endl;
            cout<<"Frog Distance = ";
            printf("%.3f
    
    ",sqrt(dis[2]));
        } 
        return 0;
    }
  • 相关阅读:
    17 Letter Combinations of a Phone Number(medium)
    16 3Sum closest(medium)
    15 3Sum(medium)
    linux环境下搭建自动化Jenkins管理工具
    Danjgo学习笔记(五)----Django数据库的查询
    Danjgo学习笔记(五)----Django中表的关系
    Django常见的Field
    selenium+python+ip池 实现博客园刷博客浏览量
    Danjgo学习笔记(五)----常见模板过滤器和自制过滤器
    Danjgo学习笔记(四)---danjgo框架内的常用标签
  • 原文地址:https://www.cnblogs.com/ylrwj/p/10679295.html
Copyright © 2011-2022 走看看