Luogu P1629 郵遞員送信

2021-08-31 06:44:30 字數 1614 閱讀 9454

有乙個郵遞員要送東西,郵局在節點1.他總共要送n-1樣東西,其目的地分別是2~n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n-1樣東西並且最終回到郵局最少需要多少時間。

輸入格式:

第一行包括兩個整數n和m。

第2到第m+1行,每行三個數字u、v、w,表示從a到b有一條需要w時間的道路。 滿足1<=u,v<=n,1<=w<=10000,輸入保證任意兩點都能互相到達。

【資料規模】

對於30%的資料,有1≤n≤200;

對於100%的資料,有1≤n≤1000,1≤m≤100000。

輸出格式:

輸出僅一行,包含乙個整數,為最少需要的時間。

輸入樣例#1:複製

5 10

2 3 5

1 5 5

3 5 6

1 2 8

1 3 8

5 3 4

4 1 8

4 5 3

3 5 6

5 4 2

輸出樣例#1:複製

83
簡化題意:從頂點1出發,到其餘節點後再返回的距離和

從1號節點出發到其他節點的距離可以跑一邊最短路求出

那從其他節點到1號節點呢?

走迷宮的時候有一種技巧,就是從終點到起點,這樣走彎路比較少(人品型剪枝)

所以從其他節點到1號節點等價於

反向建邊後,從1號節點到其他節點

如上,再跑一邊dijkstra即可

注意初始化堆(菜雞這回不會錯了,哈哈哈哈哈哈哈哈)

#include#include#define ll long long

using namespace std;

int read()

const int n=1e6+5;

int n,m,d[n];

ll ans=0;

int cnt,to[n],nxt[n],w[n],he[n];

struct ae[n];

bool fl[n];

struct b;

bool operator >(b i,b j)

priority_queueq;

inline void add(int u,int v,int k)

int main()

for(int i=1;i<=n;i++) d[i]=2e9;

q.push((b));

while(!q.empty())

); }

} for(int i=1;i<=n;i++) d[i]=2e9,he[i]=0,fl[i]=0;

cnt=0;

for(int i=1;i<=m;i++)

add(e[i].v,e[i].u,e[i].k);

q.push((b));

while(!q.empty())

); }

} printf("%lld\n",ans);

return 0;

}

LuoguP1629 郵遞員送信

題目鏈結 題目大意 讓你求1到 2 n 2 n2 n的路徑和2 n 2 n2 n到1的路徑,然後加起來 思路 起點為1的做法比較簡單,可以用spfa來做 其實2 n 2 n2 n到1的路徑就把圖反過來得到的值就是2 n 2 n2 n到1的路徑 include include include usin...

Luogu P1629 郵遞員送信「程式設計題」

瀏覽一遍題目,很容易分析出是最短路模型。首先跑一次1號店到其他點的最短路,然後在他返回時從每乙個點都跑一次最短路,但在返回過程中我們只利用每個點到1號點的最短路,卻要跑 n 1 次,所以顯然十分浪費。並且複雜度是o n m log n 如何解決這個問題呢?如果我們把每條邊的方向反過來,那麼原來每個點...

題解 郵遞員寄信 luoguP1629

有乙個郵遞員要送東西,郵局在結點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。第一行包含兩個正整數n和m 接下來m行...