洛谷P1354 房間最短路問題 floyd

2021-08-19 22:14:16 字數 1386 閱讀 3702

在乙個長寬均為10,入口出口分別為(0,5)、(10,5)的房間裡,有幾堵牆,每堵牆上有兩個缺口,求入口到出口的最短路經。

輸入格式:

第一排為n(n<=20),牆的數目。

接下來n排,每排5個實數x,a1,b1,a2,b2。

x表示牆的橫座標(所有牆都是豎直的),a1-b1和a2-b2之間為空缺。

a1、b1、a2、b2保持遞增,x1-xn也是遞增的。

輸出格式:

輸出最短距離,保留2位小數。

輸入樣例

2

4 2 7 8 9

7 3 4.5 6 7

輸出樣例

10.06
#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct wall

w[22];

int n;

double e[101][101];

bool hathes(int a,int b,int w1,int w2)

return1;}

void addedge(int a,int b,int w1,int w2)

int main()

w[0].x=0;w[++n].x=10;

for (int i=1;i<5;i++) w[0].z[i]=w[n].z[i]=5;//初始化起點與終點

for (int i=0;ifor (int j=i+1;j<=n;j++) for (int k=1;k<5;k++) for (int l=1;l<5;l++) addedge(i,j,k,l);//迴圈建邊

for (int i=0;i<101;i++) e[i][i]=0;

for (int k=1;k<=n*4+4;k++)

for (int i=1;i<=n*4+4;i++)

for (int j=1;j<=n*4+4;j++)

e[i][j]=min(e[i][j],e[i][k]+e[k][j]);//floyd

printf("%.2f\n",e[1][n*4+1]);

return

0;}

P1354 房間最短路問題

看到此題,第乙個想到的是貪心 要從 0.0,5.0 走到 10.0,5.0 就要繞過一些牆,那就會經過一些牆的端點 下文稱之為節點 單從樣例看來,就會說走到離當前節點距離最小的點就行了,但真的是這樣嗎?顯然不是,原因有二 如果起點到終點沒有障礙,那麼走其它節點是不是就會走了冗餘的路?是的,在某些最優...

luogu P1354 房間最短路問題

火焰之地傳送門 憑心而論這題挺水的,一道計算幾何加工的最短路。用前面牆的個數 4 當前牆上的序號表示點的序號,對於每個點 包括起點和終點 列舉其後面牆上的所有點一一判斷是否可與之相連,能相連就連邊,最後跑一遍floyd。判斷直接用數學公式做一次函式就行。呆馬 include include incl...

Luogu P1354 房間最短路問題

這是一道紫題,然而實際上我覺得也就藍題難度甚至不到。and,這道題就是一道數學題,模擬計算過程。求最短路嘛,肯定要考慮建圖,只需要把中間的牆上每個口的邊緣處的點作為圖中的點就行。至於為什麼,顯然如果我們取中間任何乙個點連邊,到下一面牆時路徑之和總是比連其中乙個邊緣的點要大,直觀感 g n覺 ju 一...