1. 程式人生 > >洛谷—— P1629 郵遞員送信

洛谷—— P1629 郵遞員送信

%d bsp n-1 表示 所有 div 最終 inline problem

https://www.luogu.org/problem/show?pid=1629

題目描述

有一個郵遞員要送東西,郵局在節點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

正反兩邊SPFA
 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4
#include <queue> 5 6 using namespace std; 7 8 const int N(1000+5); 9 const int M(100005); 10 int n,m; 11 long long ans; 12 int hed[N],had[N],sumedge; 13 struct Edge 14 { 15 int v,next,w; 16 Edge(int v=0,int next=0,int w=0): 17 v(v),next(next),w(w){} 18 }edge[M<<1
]; 19 inline void ins(int u,int v,int w,int *head) 20 { 21 edge[++sumedge]=Edge(v,head[u],w); 22 head[u]=sumedge; 23 } 24 25 bool inq[N]; 26 queue<int>que; 27 int dis1[N],dis2[N]; 28 inline void SPFA_1() 29 { 30 memset(dis1,127/3,sizeof(dis1)); 31 dis1[1]=0; que.push(1); inq[1]=1; 32 for(int u,v;!que.empty();) 33 { 34 u=que.front(); que.pop(); inq[u]=0; 35 for(int i=hed[u];i;i=edge[i].next) 36 { 37 v=edge[i].v; 38 if(dis1[v]>dis1[u]+edge[i].w) 39 { 40 dis1[v]=dis1[u]+edge[i].w; 41 if(!inq[v]) inq[v]=1,que.push(v); 42 } 43 } 44 } 45 } 46 inline void SPFA_2() 47 { 48 memset(dis2,127/3,sizeof(dis2)); 49 dis2[1]=0; que.push(1); inq[1]=1; 50 for(int u,v;!que.empty();) 51 { 52 u=que.front(); que.pop(); inq[u]=0; 53 for(int i=had[u];i;i=edge[i].next) 54 { 55 v=edge[i].v; 56 if(dis2[v]>dis2[u]+edge[i].w) 57 { 58 dis2[v]=dis2[u]+edge[i].w; 59 if(!inq[v]) inq[v]=1,que.push(v); 60 } 61 } 62 } 63 } 64 65 int main() 66 { 67 scanf("%d%d",&n,&m); 68 for(int u,v,w,i=1;i<=m;i++) 69 { 70 scanf("%d%d%d",&u,&v,&w); 71 ins(u,v,w,hed);ins(v,u,w,had); 72 } 73 SPFA_1(); SPFA_2(); 74 for(int i=2;i<=n;i++) ans+=(long long)dis1[i]+dis2[i]; 75 printf("%lld\n",ans); 76 return 0; 77 }

洛谷—— P1629 郵遞員送信