題目大意:
求出乙個點到其他所有點的最短路徑。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 ...