集合位置(洛谷 P1491)

2021-09-28 11:02:56 字數 2019 閱讀 2708

題目描述

每次有大的活動,大家都要在一起「聚一聚」,不管是去好樂迪,還是避風塘,或者湯姆熊,大家都要玩的痛快。還記得心語和花兒在跳舞機上的激情與釋放,還記得草草的投籃技藝是如此的高超,還記得狗狗的槍法永遠是』s』……還有不能忘了,胖子的歌聲永遠是讓我們驚叫的!!

今天是野貓的生日,所以想到這些也正常,只是因為是上學日,沒法一起去玩了。但回憶一下那時的甜蜜總是一種幸福嘛。。。

但是每次集合的時候都會出現問題!野貓是公認的「路盲」,野貓自己心裡也很清楚,每次都提前出門,但還是經常遲到,這點讓大家很是無奈。後來,野貓在每次出門前,都會向花兒諮詢一下路徑,根據已知的路徑中,總算能按時到了。

現在提出這樣的乙個問題:給出n個點的座標,其中第乙個為野貓的出發位置,最後乙個為大家的集合位置,並給出哪些位置點是相連的。野貓從出發點到達集合點,總會挑一條最近的路走,如果野貓沒找到最近的路,他就會走第二近的路。請幫野貓求一下這條第二最短路徑長度。

輸入格式

第一行是兩個整數n(1<=n<=200)和m,表示一共有n個點和m條路,以下n行每行兩個數xi,yi,(-500<=xi,yi<=500),代表第i個點的座標,再往下的m行每行兩個整數pj,**,(1<=pj,**<=n),表示兩個點相通。

輸出格式

只有一行包含乙個數,為第二最短路線的距離(保留兩位小數),如果存在多條第一短路徑,則答案就是第一最短路徑的長度;如果不存在第二最短路徑,輸出-1。

輸入 #1

3 3

0 01 1

0 21 2

1 32 3

輸出 #1

2.83

一道神仙次短路題;

首先,這是一道簡單路徑的題目,也就說這裡的點不能重複走,但是題目沒說;所以這道題如果你用雙dij跑然後列舉邊求次短路的話只有80分,因為點重複走了;所以這道題只能列舉刪邊法求次短路,當然你也可以a*然後判重,防止走重複點;

列舉刪邊求次短路的話就是先跑一遍dij,把最短路徑找出來,然後依次列舉這些邊,每次刪一條,然後再跑dij,求次短路;複雜度為(n^2logn);複雜度很高,但是這道題就要這麼寫;

**:

#include

#define ll long long

#define pa pair

using

namespace std;

struct nodedian[

210]

;double

len(

int p,

int q)

int head[

210]

,cnt;

int n,m;

struct nodedge[

200000];

void

add(

int p,

int q,

double w)

double dis[

210]

;bool vis[

210]

;int to[

210]

;struct di};

void

dijkstra

(int p,

int q)}}

}int

main()

dijkstra(-

1,-1

);double ans=

2e9*

1.0;

int now=n;

//從後往前遍歷

while

(to[now])if

(ans==

2e9*

1.0)

printf

("-1\n");

else

printf

("%.2f\n"

,ans)

;return0;

}

洛谷P1491 集合位置

每次有大的活動,大家都要在一起 聚一聚 不管是去好樂迪,還是避風塘,或者湯姆熊,大家都要玩的痛快。還記得心語和花兒在跳舞機上的激情與釋放,還記得草草的投籃技藝是如此的高超,還記得狗狗的槍法永遠是 s 還有不能忘了,胖子的歌聲永遠是讓我們驚叫的!今天是野貓的生日,所以想到這些也正常,只是因為是上學日,...

洛谷P1491集合位置

題目鏈結 就是求第乙個點到第n個點的次短路 第一次spfa用前驅記錄最短路 第二次spfa刪去最短路中的一條邊 記錄前驅開乙個pre陣列,在每次鬆弛操作時,如果d i 被更新就pre i j 表示當前到第i個點的最短路中,j是i的前驅節點 主函式中,從第n個點開始,即i n,不斷地進行找前驅i pr...

洛谷P1491集合位置

這個題說白了就是求乙個次短路。方法是我們先跑一遍最短路,記錄下最短路上每乙個點的前驅。然後我們將最短路上每一條邊都標記一次,分別跑一邊最短路,求出最短路徑即可。在這我們不用特殊判斷是否是第二條次短路還是最短路。因為我們求出的 ans 是乙個最小值。include include include in...