SSL ZYC 模板 單源最短路徑 SPFA

2021-08-20 22:25:34 字數 1931 閱讀 7431

題目大意:

求出乙個點到其他所有點的最短路徑。in

put inp

ut

4 6 1

1 2 2

2 3 2

2 4 1

1 3 5

3 4 3

1 4 4

ou

tput

o utput

0 2 4 3
思路:

思路一:dijkstra

當時還沒有學spfa,看了資料感覺dijkstra可以卡過,於是打了一發dijkstra,結果

也許是我打錯了,可能可以得70分。請dalao指教。

#include 

#include

#include

const

int inf=99999999;

using

namespace

std;

int n,m,k,a[10001][10001],b[10001],c[10001],minn,o,x,y;

int main()

b[k]=1;

a[k][k]=0;

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

if (a[i][k]>0) c[i]=a[i][k];

else c[i]=inf;

c[k]=0;

for (int j=1;j<=n-1;j++)

b[o]=1; //訪問

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

if (b[i]==0&&c[i]>a[o][i]+c[o]) c[i]=c[o]+a[o][i]; //更新最短路

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

if (c[i]!=inf) printf("%d ",c[i]);

else

printf("2147483647 ");

return

0;}

思路二:spfa

這道題的正解就是spfa。首先用鄰接表儲存邊(用鄰接矩陣會mle,而且那還叫什麼spfa),然後利用模板庫qu

eue que

ue構造佇列,利用鄰接表加速,依次訪問每個點,更新最短路,最終輸出加乙個判斷就可以了。

#include 

#include

#include

using

namespace

std;

const

int inf=99999999;

int n,m,s,t,k,head[30001],dis[30001],vis[30001],x,y,dis;

struct edge //鄰接表

e[1500001];

void add(int from,int to,int dis) //建圖

void spfa()

q.push(s); //加入出發點

vis[s]=1;

dis[s]=0;

while (q.size()) //相當於 while(!q.empty())}}

}}int main()

spfa();

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

dis[i]==inf?printf("2147483647 "):printf("%d ",dis[i]); //相當於 if (dis[i]!=inf) printf("%d ",dis[i]); else printf("2147483647 ");

return

0;}

模板 單源最短路徑

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整數,其中第i個整數表示從...

單源最短路徑 模板 dijkstra

p4779 模板 單源最短路徑 標準版 原題鏈結 鏈式前向星 題目描述 給定乙個 n個點,m條有向邊的帶非負權圖,請你計算從 s 出發,到每個點的距離。資料保證你能從 s 出發到任意點。輸入格式 第一行為三個正整數 n,m,s。第二行起 m 行,每行三個非負整數 ui,vi,wi表示從ui到 vi ...

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...