1. 程式人生 > >New Game! (最短路+建圖)

New Game! (最短路+建圖)

std fab pre lse quest map n) 位置 str

New Game!

https://www.nowcoder.com/acm/contest/201/L

題目描述

Eagle Jump公司正在開發一款新的遊戲。Hifumi Takimoto作為其中的員工,獲得了提前試玩的機會。現在她正在試圖通過一個迷宮。
這個迷宮有一些特點。為了方便描述,我們對這個迷宮建立平面直角坐標系。迷宮中有兩條平行直線 L1:Ax+By+C1=0, L2:Ax+By+C2=0,還有 n 個圓 技術分享圖片。角色在直線上、圓上、園內行走不消耗體力。在其他位置上由S點走到T點消耗的體力為S和T的歐幾裏得距離。
Hifumi Takimoto想從 L1 出發,走到 L2 。請計算最少需要多少體力。

輸入描述:

第一行五個正整數 n,A,B,C
1
,C
2
 (1≤ n ≤ 1000, -10000 ≤ A,B,C
1
,C
2
 ≤ 10000),其中 A,B 不同時為 0。
接下來 n 行每行三個整數 x,y,r(-10000 ≤ x,y ≤ 10000, 1≤ r ≤ 10000) 表示一個圓心為 (x,y),半徑為 r 的圓。

輸出描述:

僅一行一個實數表示答案。與正確結果的絕對誤差或者相對誤差不超過 10
-4
 即算正確。

輸入

2 0 1 0 -4
0 1 1
1 3 1

輸出

0.236068


可以把圓看成一個點,利用點到直線的距離公式和點到點的距離公式,求出各個點之間的距離,跑一遍最短路即可
技術分享圖片
 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<stack> 6 #include<algorithm> 7 #include<cmath> 8 #define PI acos(-1.0) 9 #define INF 0x3f3f3f3f 10 using namespace std; 11 12 int n; 13 double A,B,C1,C2; 14 struct Circle{ 15 double x,y,r;
16 }p[1005]; 17 18 double map[1005][1005]; 19 double vis[1005]; 20 double dis[1005]; 21 22 double dist1(Circle a,Circle b){ 23 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))-a.r-b.r; 24 } 25 26 double dist2(double a,double b,double c,Circle d){ 27 return (fabs(a*d.x+b*d.y+c)/sqrt(a*a+b*b)-d.r); 28 } 29 30 void Dijstra(){ 31 for(int i=1;i<=n+2;i++){ 32 dis[i]=map[1][i]; 33 vis[i]=0; 34 } 35 vis[1]=1; 36 dis[1]=0; 37 for(int i=1;i<n+2;i++){ 38 double minn=INF; 39 int pos=0; 40 for(int j=1;j<=n+2;j++){ 41 if(!vis[j]&&dis[j]<minn){ 42 minn=dis[j]; 43 pos=j; 44 } 45 } 46 vis[pos]=1; 47 for(int j=1;j<=n+2;j++){ 48 if(!vis[j]&&dis[j]>minn+map[pos][j]){ 49 dis[j]=minn+map[pos][j]; 50 } 51 } 52 } 53 cout<<dis[n+2]<<endl; 54 } 55 56 int main(){ 57 std::ios::sync_with_stdio(false); 58 cin>>n>>A>>B>>C1>>C2; 59 for(int i=0;i<1005;i++){ 60 for(int j=0;j<1005;j++){ 61 map[i][j]=INF; 62 } 63 } 64 for(int i=2;i<=n+1;i++){ 65 cin>>p[i].x>>p[i].y>>p[i].r; 66 } 67 double tmp; 68 for(int i=2;i<=n+1;i++){ 69 for(int j=i+1;j<=n+1;j++){ 70 tmp=dist1(p[i],p[j]); 71 if(tmp>0) 72 map[i][j]=map[j][i]=tmp; 73 else 74 map[i][j]=map[j][i]=0; 75 } 76 } 77 for(int i=2;i<=n+1;i++){ 78 tmp=dist2(A,B,C1,p[i]); 79 if(tmp>0) 80 map[1][i]=map[i][1]=tmp; 81 else 82 map[1][i]=map[i][1]=0; 83 tmp=dist2(A,B,C2,p[i]); 84 if(tmp>0) 85 map[n+2][i]=map[i][n+2]=tmp; 86 else 87 map[n+2][i]=map[i][n+2]=0; 88 } 89 map[1][n+2]=map[n+2][1]=fabs(C1-C2)/sqrt(A*A+B*B); 90 Dijstra(); 91 92 }
View Code

New Game! (最短路+建圖)