日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客网 New Game! 建图+最短路

發(fā)布時(shí)間:2024/10/6 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网 New Game! 建图+最短路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接:https://www.nowcoder.com/acm/contest/201/L
來源:??途W(wǎng)
?

時(shí)間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 1048576K,其他語言2097152K
Special Judge, 64bit IO Format: %lld

題目描述

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

輸入描述:

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

輸出描述:

僅一行一個(gè)實(shí)數(shù)表示答案。與正確結(jié)果的絕對誤差或者相對誤差不超過 10-4 即算正確。

?

示例1

輸入

復(fù)制

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

輸出

復(fù)制

0.236068

分析:

L1 到L2 之間連邊權(quán)值??

直線L與圓i 之間的權(quán)值 max( 0,dis(Oi,L)-Ri )

圓 i 與圓 j 之間的權(quán)值 max( 0,dis(Oi,Oj) -Ri-Rj )

求直線L1(0點(diǎn))與直線L2(n+1點(diǎn))之間的最短路

#include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; const double eps=1e-4; const double inf = 1e9+7; int n; int a,b,c1,c2; bool vis[maxn]; double mp[maxn][maxn]; double dis[maxn];struct circle {int x,y;int r; }; circle cir[maxn]; double dist(int i,int j) {return sqrt((cir[i].x-cir[j].x)*(cir[i].x-cir[j].x)+(cir[i].y-cir[j].y)*(cir[i].y-cir[j].y)); }double distLine(int c,int i) {return fabs(a*cir[i].x + b*cir[i].y + c )/sqrt(a*a+b*b); }void spfa(int from,int to) {memset(vis,0,sizeof vis);//memset(dis.inf,sizeof dis);for(int i=0;i<maxn;i++)dis[i]=inf;queue<int> q;q.push(from);vis[from]=true;dis[from]=0;while(!q.empty()){int cur=q.front();q.pop();vis[cur]=false;for(int i=0;i<=n+1;i++){if(dis[i]>dis[cur]+mp[cur][i]){dis[i]=dis[cur]+mp[cur][i];if(!vis[i]){vis[i]=true;q.push(i);}}}} } int main() {while(scanf("%d %d %d %d %d",&n,&a,&b,&c1,&c2)!=EOF){//printf("%d %d %d %d %d\n",n,a,b,c1,c2);for(int i=1;i<=n;i++){//printf("%d\n",i);scanf("%d%d%d",&cir[i].x,&cir[i].y,&cir[i].r);}double d=fabs(c1-c2)/sqrt(a*a+b*b);mp[0][n+1]=mp[n+1][0]=d;for(int i=1;i<=n;i++){d=distLine(c1,i)-cir[i].r;if(d<=eps)mp[0][i]=mp[i][0]=0;elsemp[0][i]=mp[i][0]=d;d=distLine(c2,i)-cir[i].r;if(d<=eps)mp[n+1][i]=mp[i][n+1]=0;elsemp[n+1][i]=mp[i][n+1]=d;for(int j=i+1;j<=n;j++){d=dist(i,j)-cir[i].r-cir[j].r;if(d<=eps)mp[i][j]=mp[j][i]=0;elsemp[i][j]=mp[j][i]=d;}}spfa(0,n+1);printf("%.6lf\n",dis[n+1]);} }

?

總結(jié)

以上是生活随笔為你收集整理的牛客网 New Game! 建图+最短路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。