P1629 郵遞員送信

2022-05-13 12:37:18 字數 1915 閱讀 2947

有乙個郵遞員要送東西,郵局在節點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 #include2 #include3 #include4 #include5 #include6 #include7

#define lli long long int

8using

namespace

std;

9const

int maxn=100001;10

const

int maxn=0x7ffff;11

void read(int &n)

1216

while(c>='

0'&&c<='9'

)17

18 flag==1?n=-x:n=x;19}

20int

n,m;

21struct

node

22edge[maxn*4

];25

inthead[maxn];

26int num=1;27

intx[maxn],y[maxn],z[maxn];

28void add_edge(int x,int y,int

z)29

36int

vis[maxn];

37int

dis[maxn];

38void dj(int

bg)39

57}

58 vis[pos]=1;59

for(int i=head[pos];i!=-1;i=edge[i].nxt)

6065}66

}67intmain()

6880

int ans=0

;81 dj(1

);82

int ans2=0;83

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

84 ans+=dis[i];

85for(int i=1;i<=n;i++)

86 head[i]=-1

;87 num=1;88

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

89add_edge(y[i],x[i],z[i]);

90 dj(1

);91

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

92 ans+=dis[i];

93 printf("%d"

,ans);

94return0;

95 }

P1629 郵遞員送信

有乙個郵遞員要送東西,郵局在節點 11。他總共要送 n 1n 1 樣東西,其目的地分別是節點 22 到節點 nn。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有 mm 條道路。這個郵遞員每次只能帶一樣東西,並且運送每件物品過後必須返回郵局。求送完這 n 1n 1 樣東西並且最終回到郵局最...

題解 P1629 郵遞員送信

題目 dijkstra 鏈式前向星 堆優化的題解。這一題明顯是求最短路。與模板不同,它要求的是多源最短路,是每個節點到源點的距離。這裡如果用暴力,或者每個節點求一遍,顯然在時間上是過不去的。每個節點求一遍的堆優化的dijkstra是50分 所以,就要用乙個重要的結論 逆圖中源點到各個點的最短路就是原...

洛谷 P1629 郵遞員送信

題目大意 求乙個郵遞員把信分別送到2 n的最短路,與他回到節點的最短路之和。dijkstra 題目是無向圖並且要求求出來回最短路之和。2.用dijkstra求1到其它點的最短路,再將每條邊反向再求一次1到其它點的最短路,然後相加。時間複雜度 o n 2 var m array 0.1001 of b...