有乙個郵遞員要送東西,郵局在節點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 102 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
本來一看題,覺得是一道 tsp(貨郎擔)。
剛打完 狀壓dp ,發現資料範圍巨大,再看一眼題,不就是最短路???
吃棗藥丸。。。
正向圖spfa+反向圖spfa
附**:
#include#include#include#include#define maxn 1010
#define maxm 100010
#define max 999999999
using namespace std;
int n,m,c=1,d=1,ans=0;
int ahead[maxn],bhead[maxn],apath[maxn],bpath[maxn];
bool vis[maxn];
struct nodea[maxm],b[maxm];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}void add(int u,int v,int w)
inline int arelax(int u,int v,int w)
return 0;
}inline int brelax(int u,int v,int w)
return 0;
}void aspfa()
apath[1]=0;
vis[1]=true;
q.push(1);
while(!q.empty())
} }}void bspfa()
bpath[1]=0;
vis[1]=true;
q.push(1);
while(!q.empty())
} }}int main()
aspfa();
bspfa();
for(int i=2;i<=n;i++)ans+=apath[i]+bpath[i];
printf("%d\n",ans);
return 0;
}
洛谷 P1629 郵遞員送信
題目大意 求乙個郵遞員把信分別送到2 n的最短路,與他回到節點的最短路之和。dijkstra 題目是無向圖並且要求求出來回最短路之和。2.用dijkstra求1到其它點的最短路,再將每條邊反向再求一次1到其它點的最短路,然後相加。時間複雜度 o n 2 var m array 0.1001 of b...
洛谷 P1629 郵遞員送信
這個裡面判斷的東西比較多 實際上不需要這麼多的,資料給的很水 完全可以加上重邊自環什麼的 而且這道題完全暴力做n次dij 3 10 7比較危險 比較優化的方法是 第一遍dij算出郵遞員到每個地方的距離 第二遍反向建邊,橫容易看出郵遞員到每個地方的距離都是每個地方到郵遞員的距離 這種方法就可以把單終點...
洛谷P1629 郵遞員送信
題目戳 題目描述 有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入輸出格式 輸入格...