暑假裡很忙,計算機也有好幾次集訓,做了些好題,接下來幾天會分享一下。(post.pas/c/cpp)
【 題目描述】
有乙個郵遞員要送東西, 郵局在節點 1。 他總共要送 n-1 樣東西, 其目的地分別是 2~
n。 由於這個城市的交通比較繁忙, 因此所有的道路都是單行的, 共有 m 條道路, 通過每條
道路需要一定的時間。 這個郵遞員每次只能帶一樣東西。 求送完這 n-1 樣東西並且最終回到
郵局最少需要多少時間。
【 輸入格式】
輸入檔案第一行包含兩個正整數 n 和 m;
接下來 m 行, 每行三個正整數 u、 v、 w, 表示該條道路為從 u 到 v 的, 且通過這條道
路需要 w 的時間。
輸入保證任意兩點都能互相到達。
【 輸出格式】
輸出僅一行, 包含乙個整數, 為最少需要的時間。
【 樣例輸入】
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
【 樣例輸出】
83 【 資料規模】
對於 30%的資料: 1≤n≤200;
對於 100%的資料: 1≤n≤1,000; 1≤m≤100,000; 1≤u≠v≤n; 1≤w≤10,000;
本題的難點在於資料範圍。
此題的思路十分簡單,求取每個點到點1的距離和點1到每個點的距離。所以,乍一看就是弗洛伊德。求每個點之間的距離,但是n的範圍是1000。 1000資料無法過n³。
於是只能用dijkstra,spfa等更快的演算法。但是用這些演算法如何求取點i到1的距離呢?此題需要用到反向建圖。
例如此圖,正向spfa可知f[1][2]=4,f[1][3]=15。即dis[2]=4,dis[3]=15。
同時我們可以知道,f[2][1]=18,f[3][1]=7。如果將i,j反過來,則是f[1][2]=18,
f[1][3]=7。因此,只要我們反過來,令f[i][j]=f[j][i]。再做一遍spfa,即可
求出n點到1點的距離。
例如此圖,使f[1][3]=f[3][1]=7,f[3][2]=f[2][3]=11。則3至1的距離就等於f[1][3]=7。這樣,就可以求出1為終點的值。
下面是**(很醜很長很silly,高手勿噴)
#include
#include
using namespace std;
int i,j,k,n,m,tot,ans;
int f[1005][1005],dis[1005],u[1005][1005],q[10005],num[10005],q1[1000005],num1[1000005],f1[1005][1005];
intread()
int min(int a,int b)else
for(register int i=1;i<=n;i++) dis[i]=2000000;
for(register int i=1;i<=m;i++)
int head=0,tail=1;q[tail]=1;dis[1]=0;num[tail]=0;
while(headfor(register int i=1;i<=n;i++)}}
for(register int i=1;i<=n;i++) ans+=dis[i];
for(register int i=1;i<=n;i++) dis[i]=2000000;
int h=0,t=1;q1[t]=1;dis[1]=0;num1[t]=0;
while(hfor(register int i=1;i<=n;i++)
郵遞員送信
題目描述 有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入輸出格式 輸入格式 第一...
郵遞員送信(最短路)
郵遞員送信 題目描述 有乙個郵遞員要送東西,郵局在結點1。他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入檔案 輸入檔案...
Luogu P1629 郵遞員送信
有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入格式 第一行包括兩個整數n和m。第...