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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

编程问答

%大赛D--链式前向星+SPFA(BFS)+各种数据类型+各种最短路复习

發(fā)布時(shí)間:2024/1/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 %大赛D--链式前向星+SPFA(BFS)+各种数据类型+各种最短路复习 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

單源最短路模板題,這里嘗試用SPFA,但有幾點(diǎn)細(xì)節(jié):

①不能用鄰接矩陣,開(kāi)不下1e5*1e5的二維數(shù)組;鄰接表vector<p>G[maxn]或鏈?zhǔn)角跋蛐?/p>

②注意用longlong,而且INF定義為LONG_LONG_MAX(不要手打整數(shù),因?yàn)槟J(rèn)為int,也可強(qiáng)制類(lèi)型轉(zhuǎn)換(1e16))

復(fù)習(xí):long double,unsigned long long...log

1e16 ?double ?

999999999999999... ?int(溢出)

?

③最短路算法復(fù)習(xí):

a.Dijkstra??

一開(kāi)始覺(jué)得和Prim很像,都用到貪心,而且選好點(diǎn)后,更新與這點(diǎn)相關(guān)(可到達(dá))的數(shù)據(jù),但是貪心的對(duì)象有細(xì)微不同。

Prim是dis一維數(shù)組(表示目前已加入生成樹(shù)的點(diǎn),到其相鄰結(jié)點(diǎn)的權(quán)值的最小值)進(jìn)行貪心,沒(méi)有dp的思想;

Dijkstra對(duì)松弛操作的dis一維數(shù)組(表示起點(diǎn)到該點(diǎn)的最小距離,還要加上前面已經(jīng)得到的最小距離,而前面得到局部最小距離,必須也是全局最小距離,這是算法成立的關(guān)鍵,也是為什么Dijkstra只支持非負(fù)邊,這里最優(yōu)子結(jié)構(gòu)的思想,類(lèi)似dp貪心,取出最小所在的的結(jié)點(diǎn)P,然后對(duì)該點(diǎn)P鄰點(diǎn)(這里類(lèi)似廣搜),更新數(shù)據(jù),vis標(biāo)記該點(diǎn)P,最后往復(fù)上述操作直到所有vis的點(diǎn)被標(biāo)記上。

dis? ?1? ????2 ????3 ? ? ?4???? 5???? 6? ? ?(綠色表示當(dāng)前取得,紅色表示vis標(biāo)記過(guò)已經(jīng)取過(guò)的點(diǎn),藍(lán)色代表更新的點(diǎn))

? ? ? ?0? ? ? 7????? 9?????∞? ??????14

? ? ? ?0? ? ?7? ? ? 9? ? ??? ? ∞??? 14

? ? ? ?0? ? ?7? ? ? 9? ? ? 22? ? ? ?14

????? ?0? ? ?7? ? ? 9? ?? ?20? ? ? ?11

? ? ? ?0? ? ?7? ? ? 9? ? ? 20? ? ∞? ?11

? ? ? ?0? ? ?7? ? ? 9? ? ?20? ? 20? ?11

? ? ? ...

?????? 0? ? ?7? ? ? 9? ? ? 20? ? 20? ?11

具體思想看看這篇博客:

點(diǎn)擊打開(kāi)鏈接

?

b.Floyd

聯(lián)想到之前離散數(shù)學(xué)學(xué)的傳遞閉包Warshall求法:

①k 1-n 找到第k列

②i 1-n? 找到值為1的行,下標(biāo)i→if(a[i][k]==1)→則執(zhí)行③j 1-n? ?a[i][j]=a[k][j]

用到三重循環(huán),Floyd與之類(lèi)似,只不過(guò)思想有所改變:

找到第k個(gè)結(jié)點(diǎn)作為中間點(diǎn),比較i到j(luò)直達(dá)的距離和加了中間點(diǎn)k距離。

?

c.

?

最近市面出現(xiàn)了一款全新的游戲,Absolute Counter Online,簡(jiǎn)稱(chēng)ACO。Asuna跟她的男票Kirito也都跑去玩這個(gè)了。
? ? 把Kirito傳送了K次之后,Asuna終于氣消了。。。
????最新情報(bào),在這個(gè)游戲里,也有傳說(shuō)中的圣劍excalibur,俗稱(chēng)咖喱棒。作為耍劍的高手Kirito自然不能放過(guò)這么好的一個(gè)機(jī)會(huì)。游戲里有N那個(gè)城市,同時(shí)有M條道路連接不同的兩個(gè)城市,經(jīng)過(guò)不同的道路耗費(fèi)的時(shí)間是不同的。當(dāng)前Kirito在編號(hào)為S的城市,得到的消息是圣劍藏在編號(hào)為T(mén)的城市中。因?yàn)橛螒蛑衅渌婕乙蚕霌屖?#xff0c;所以Kirito希望用最快的速度到達(dá)城市T。而Asuna發(fā)現(xiàn),每個(gè)城市中都會(huì)有一個(gè)傳送用的魔法陣,可以快速將他們傳送到任意一個(gè)城市(沒(méi)錯(cuò),這次他們是兩人一起傳送),不同的魔法陣傳送的用時(shí)也不同。

Input

多組數(shù)據(jù),EOF結(jié)尾。
每組數(shù)據(jù)先輸入兩個(gè)整數(shù)N和M,表示有N個(gè)城市及M條無(wú)向邊。
2 <= N <= 100000
1 <= M <= 200000
接下來(lái)一行,輸入N個(gè)整數(shù),第i個(gè)數(shù)字表示城市i的魔法陣,傳送的用時(shí)Ui, 1<=Ui<=1000000000。
接下來(lái)輸入兩個(gè)整數(shù)S和T,表示Kirito他們所在城市,以及圣劍所在城市,1<=S,T<=N 且 S!=T。
接下來(lái)M行,每行三個(gè)整數(shù)X, Y, W,表示一條連接X(jué)和Y兩個(gè)城市的無(wú)向邊,通過(guò)這條邊的耗時(shí)為W,1<=X,Y<=N, X!=Y, 1<=W<=1000000000。
?

Output

對(duì)于每組數(shù)據(jù),輸出格式為:“Case #k: u”,k表示第k組數(shù)據(jù),從1開(kāi)始,u表示最短用時(shí)。

Sample Input

4 3 1 2 3 4 1 4 1 2 1 2 3 1 3 4 1 4 3 10 2 3 4 1 4 2 1 1 2 3 1 3 4 1

Sample Output

Case #1: 1 Case #2: 3

?

#include <stdio.h> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn=300001; const long long inf =(long long)(1e16); //不能直接打數(shù)字!!!默認(rèn)是int會(huì)WA struct edge { int from,to,next; long long w; }e[1000001]; int head[maxn]; int vis[maxn]; int vis2[maxn]; long long dist[maxn]; long long mo[maxn]; int n,m,t; void add(int i,int j,long long w) { e[t].from=i; e[t].to=j; e[t].w=w; e[t].next=head[i]; head[i]=t++; } long long spfa(int s,int end,int n) { queue <int> q; for(int i=1;i<=n;i++) dist[i]=inf; memset(vis,false,sizeof(vis)); memset(vis2,false,sizeof(vis2)); q.push(s); dist[s]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; if(dist[v]>dist[u]+e[i].w) { dist[v]=dist[u]+e[i].w; if(!vis[v]) { vis[v]=true; q.push(v); } }} } long long res= dist[end];for(int i=1;i<=n;i++){res=min(res,dist[i]+mo[i]);}return res;} int main() { int a,b,s,e; long long c;int cnt=1; // scanf("%d%d",&n,&m); while(cin>>n>>m){memset(mo,0,sizeof(mo));t=0; memset(head,-1,sizeof(head)); //memset(dist,0,sizeof(dist));for(int i=1;i<=n;i++){scanf("%lld",&mo[i]);}scanf("%d%d",&s,&e); while(m--) { scanf("%d%d%lld",&a,&b,&c); add(a,b,c); add(b,a,c);} long long res1= spfa(s,e,n); printf("Case #%d: %lld\n",cnt,res1);cnt++;}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的%大赛D--链式前向星+SPFA(BFS)+各种数据类型+各种最短路复习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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