日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[蓝桥杯]算法提高 道路和航路(spfa+deque+快读优化)

發(fā)布時(shí)間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯]算法提高 道路和航路(spfa+deque+快读优化) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題描述
農(nóng)夫約翰正在針對一個(gè)新區(qū)域的牛奶配送合同進(jìn)行研究。他打算分發(fā)牛奶到T個(gè)城鎮(zhèn)(標(biāo)號為1…T),這些城鎮(zhèn)通過R條標(biāo)號為(1…R)的道路和P條標(biāo)號為(1…P)的航路相連。

每一條公路i或者航路i表示成連接城鎮(zhèn)Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代價(jià)為Ci。每一條公路,Ci的范圍為0<=Ci<=10,000;由于奇怪的運(yùn)營策略,每一條航路的Ci可能為負(fù)的,也就是-10,000<=Ci<=10,000。

每一條公路都是雙向的,正向和反向的花費(fèi)是一樣的,都是非負(fù)的。

每一條航路都根據(jù)輸入的Ai和Bi進(jìn)行從Ai->Bi的單向通行。實(shí)際上,如果現(xiàn)在有一條航路是從Ai到Bi的話,那么意味著肯定沒有通行方案從Bi回到Ai。

農(nóng)夫約翰想把他那優(yōu)良的牛奶從配送中心送到各個(gè)城鎮(zhèn),當(dāng)然希望代價(jià)越小越好,你可以幫助他嘛?配送中心位于城鎮(zhèn)S中(1<=S<=T)。

輸入格式
輸入的第一行包含四個(gè)用空格隔開的整數(shù)T,R,P,S。

接下來R行,描述公路信息,每行包含三個(gè)整數(shù),分別表示Ai,Bi和Ci。

接下來P行,描述航路信息,每行包含三個(gè)整數(shù),分別表示Ai,Bi和Ci。

輸出格式
輸出T行,分別表示從城鎮(zhèn)S到每個(gè)城市的最小花費(fèi),如果到不了的話輸出NO PATH。
樣例輸入
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
樣例輸出
NO PATH
NO PATH
5
0
-95
-100
數(shù)據(jù)規(guī)模與約定
對于20%的數(shù)據(jù),T<=100,R<=500,P<=500;

對于30%的數(shù)據(jù),R<=1000,R<=10000,P<=3000;

對于100%的數(shù)據(jù),1<=T<=25000,1<=R<=50000,1<=P<=50000。
思路:
這本來是最短路的一道模板題,但是太扯淡了,弄了很久。
坑點(diǎn):
①有負(fù)數(shù)邊,得用spfa。
②邊數(shù)特別大,所以得優(yōu)化一下,我用的deque+快讀優(yōu)化。
③空間不要開小了,開小了會超時(shí)。。

但是就算是這樣,在dotcpp網(wǎng)站上還是沒有過去,得分95。在藍(lán)橋杯官網(wǎng)的網(wǎng)站上以421ms過的。

代碼如下:

#include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f using namespace std;const int maxx=1e5+10; const int maxm=1e6+10; struct edge{int to,next,w; }e[maxx<<6]; int head[maxx<<6],dis[maxx],vis[maxx],num[maxx]; int n,r,p,s,tot;inline void init() {tot=0;memset(head,-1,sizeof(head)); } inline void add(int u,int v,int w) {e[tot].to=v,e[tot].next=head[u],e[tot].w=w,head[u]=tot++; } inline void spfa() {memset(dis,inf,sizeof(dis));memset(vis,0,sizeof(vis));memset(num,0,sizeof(num));dis[s]=0;vis[s]=1;deque<int> q;q.push_front(s);while(q.size()){int u=q.front();q.pop_front();vis[u]=0;for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(dis[to]>dis[u]+e[i].w){dis[to]=dis[u]+e[i].w;if(vis[to]==0){vis[to]=1;if(q.empty())q.push_front(to);else{if(dis[to]>dis[q.front()]) q.push_back(to);else q.push_front(to);}}}}} } inline int read() {int s = 0, w = 1; char ch = getchar();while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar();}while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();return s * w; } int main() {n=read(),r=read(),p=read(),s=read();init();int x,y,z;for(int i=1;i<=r;i++){x=read();y=read();z=read();add(x,y,z);add(y,x,z);}for(int i=1;i<=p;i++){x=read();y=read();z=read();add(x,y,z);}spfa();for(int i=1;i<=n;i++){if(dis[i]==inf) printf("NO PATH\n");else printf("%d\n",dis[i]);}return 0; }

(本來想用deque+LLL優(yōu)化一下呢,結(jié)果優(yōu)化還不如不優(yōu)化。??赡躄LL不適合這道題目吧。)
努力加油a啊,(o)/~

總結(jié)

以上是生活随笔為你收集整理的[蓝桥杯]算法提高 道路和航路(spfa+deque+快读优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。