1. 程式人生 > >hdu 1245 Saving James Bond 最短路spfa+簡單計算幾何

hdu 1245 Saving James Bond 最短路spfa+簡單計算幾何

題意:一個人從直徑為15米的小島上踩著鯊魚跳離湖(好奇怪的題目),湖為100*100的正方形。人最大的跳躍距離為D,給出n個鯊魚的座標,求人跳躍的最小距離及在這情況下的跳躍次數。

把島看做點0,湖外看做點n+1,先計算出這n+2個點之間的距離,若超過D則設為不連通,然後再求最短路。用pre陣列記錄路徑,可以求出跳躍次數。注意double及精度,注意如果n==0的情況。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define N 110
#define INF 1e15
using namespace std;

double x[N],y[N],d[N],mp[N][N],D;
int v[N],pre[N],n;

void spfa(int s,int t)
{
    for(int i=0;i<=n+1;i++)
    {
        d[i]=INF;
        v[i]=0;
        pre[i]=-1;
    }
    queue<int> q;
    q.push(s);
    d[s]=0;
    v[s]=1;
    while(!q.empty())
    {
        int c=q.front();
        q.pop();
        v[c]=0;
        for(int i=0;i<=n+1;i++)
        {
            if(d[i]>d[c]+mp[c][i])
            {
                pre[i]=c;
                d[i]=d[c]+mp[c][i];
                if(!v[i])   v[i]=1,q.push(i);
            }
        }
    }
    if(d[t]>=INF)
    {
        printf("can't be saved\n");
        return;
    }
    int c=t,step=0;
    while(c!=s)
        step++,c=pre[c];
    printf("%.2lf %d\n",d[t],step);
    return;
}

int main()
{
    while(~scanf("%d%lf",&n,&D))
    {
        if(n==0)
        {
            if(D>=42.5) cout<<"42.50 1"<<endl;
            else    cout<<"can't be saved"<<endl;
            continue;
        }
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&x[i],&y[i]);
        x[0]=y[0]=0.0;
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
            {
                mp[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                if((i||j)&&!(i&&j))  mp[i][j]-=7.5;
                mp[i][j]=max(mp[i][j],0.0);
                if(mp[i][j]>D)   mp[i][j]=INF;
            }
        for(int i=0;i<=n;i++)
        {
            double c=min(50-x[i],50-y[i]);
            c=min(c,min(50+x[i],50+y[i]));
            if(c>D) c=INF;
            mp[i][n+1]=mp[n+1][i]=c;
        }
        spfa(0,n+1);
    }
}

相關推薦

hdu 1245 Saving James Bond 短路spfa+簡單計算幾何

題意:一個人從直徑為15米的小島上踩著鯊魚跳離湖(好奇怪的題目),湖為100*100的正方形。人最大的跳躍距離為D,給出n個鯊魚的座標,求人跳躍的最小距離及在這情況下的跳躍次數。 把島看做點0,湖外看做點n+1,先計算出這n+2個點之間的距離,若超過D則設為不連通,然後再

hdu 1245 Saving James Bond 策畫幾何+短路 短路求步數最少的路徑

#include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #define N 200 #define eps 1e-10 #include&

Saving James BondHDU - 1245】【題意+精度處理過後的Dijkstra】

題目連結(不止是C++、G++也是能過的)   題意:一開始壓根沒讀懂題意,可能就是因為把半徑和直徑看錯了。   在中心島為(0,0)直徑為15的島上,就是主人公的位置了,然後,我們的整個逃生區域是(-50,-50)為左下角,(50,50)為右下角的這麼一個區域,

HDU 6071 同余短路 spfa

res targe star pragma std sca nts push bits Lazy Running Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/O

HDU-1548 A strange lift(短路[Spfa || BFS])

題目連結: http://acm.hdu.edu.cn/showproblem.php?pid=1548 參考部落格: https://blog.csdn.net/idealism_xxm/article/details/47625691 BFS: //BFS #include

HDU 5521 Meeting (短路SPFA+建立虛點)

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 5353    Accepted Subm

HDU 2544 短路短路/spfa

題目:http://acm.hdu.edu.cn/showproblem.php?pid=2544 程式碼: #include <stdio.h> #include <queue> using namespace std; #define RANG

短路 - spfa

class {} res ont nal farmer orm sizeof size While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A

短路 spfa 算法 && 鏈式前向星存圖

.com mem ont .aspx 百度 dfs edit 時間復雜度 tails 推薦博客 https://i.cnblogs.com/EditPosts.aspx?opt=1      http://blog.csdn.net/mcdonnell_douglas/

Saving James Bond - Easy Version 原創 2017年11月23日 13:07:33

oid nta roc bottom ++ lan was html 技術分享 06-圖2 Saving James Bond - Easy Version(25 分) This time let us consider the situation in the m

06-圖2 Saving James Bond - Easy Version(25 分)

next ted disk side || finall sizeof col reac This time let us consider the situation in the movie "Live and Let Die" in which James Bond,

pta編程題19 Saving James Bond 2

std pre .cn int iostream als else htm bfs 其它pta數據結構編程題請參見:pta 題目 和簡單版本不同的是,簡單版本只需判斷能否到達岸邊,而這個版本要求求出最少跳數的路徑。 簡單版本用dfs實現,而這道題用BFS實現。 註意: 島半

07-圖5 Saving James Bond - Hard Version(30 分)

bond style n) capture end maximum imp ant bar This time let us consider the situation in the movie "Live and Let Die" in which James Bo

POJ 3259 Wormholes【短路/SPFA判斷負環模板】

改變 air ont 數組 算法 他會 HERE push_back init 農夫約翰在探索他的許多農場,發現了一些驚人的蟲洞。蟲洞是很奇特的,因為它是一個單向通道,可讓你進入蟲洞的前達到目的地!他的N(1≤N≤500)個農場被編號為1..N,之間有M(1&l

圖論短路——spfa

print 操作 標記 pen play hide man mage 隊列 今天開始圖論的最短路的最後復習,今天自己手打spfa雖然看了一眼書,但是也算是自己打出來的,畢竟很久沒打了,而且還是一遍a代碼下來15min左右就搞完了,成就感++。所以呢來篇博客記錄一下。 香甜

hdu-5786(補圖短路

最短 can 我們 ace int 不用 scan csharp std 題意:給你n個點,m條無向邊,問你這n個點構成的完全圖,不用那m條邊,由一個s出現的單源最短路 解題思路:首先,暴力建圖不行,點太多,那麽我們就按照它的規則來,把m條邊建好,但是建的這個圖表示不走的方

C語言 06-圖2 Saving James Bond - Easy Version

This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a grou

POJ 1511 Invitation Cards(短路spfa演算法)

Invitation Cards Time Limit: 8000MS      Memory Limit: 262144K Total Submissions: 21615     &nb

Mining Station on the Sea HDU - 2448(費用流 || 短路 && hc)

Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3565

資料結構-圖-C語言-PTA-Saving James Bond - Easy Version

Data Structures and Algorithms (English) 7-10 Saving James Bond - Easy Version 以下為自己寫的版本,難過的是測試點2無法通過 #include <stdio.h> #include <