有乙個郵遞員要送東西,郵局在節點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輸出樣例#1:複製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
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行...