#include #include#include
using
namespace
std;
const
int n=1e4+5
;int head[n];//
鏈式位址
int cnt=0;//
邊的下標
struct
nodeedge[n];
void add(int u,int v,int
w)int
main()
intstart;
scanf("%d
",&start);
for(int i=head[start];i!=0;i=edge[i].from)
return0;
}
鄰接表
void add(int x,int y,intz) head
1 --head[1]=1--> ver[1]=2-->next[1]=0;
2 --head[2]=3--> ver[3]=5-->ver[2]=3-->next[2]=0;
3 --head[3]=4--> ver[4]=5-->next[4]=0;
4 --head[4]=0-->;
5 --head[5]=6--> ver[6]=1-->next[6]=5-->ver[5]=4-->next[5]=0
; 插入(
1,2),(2,3),(2,5),(3,5),(5,4),(5,1)
for(int i=head[x];i;i=next[i])
ver[i]是i條邊的終點,ver[
1 xor i]為i起點
//spfa
#includeusing
namespace
std;
int dis[500010],n,m,f,g,w,t=1,s,q[200000],h,st[500010
],tot;
bool vis[100010
];/*
st[i]表示到達i點的最後一條邊的編號;
dis[i]表示從起點到i點目前為止的最短距離;
vis[i]=true表示點i在佇列裡;
vis[i]=false表示點i不在佇列裡;
陣列q是佇列;
h是指佇列的頭指標,t是指佇列的尾指標;
*/struct node //
不開結構體,變數有點亂,所以開結構體;
e[500010
]; void add(int
from,int to,int
val)
/*val表示傳入的這條邊的權值;
from表示傳入的這條邊的起點;
to表示傳入的這條邊的終點; */
void spfa()//
核心最短路;}}
} } int main() //
主程式;
for(int i=1;i<=n;i++)//
因為題目要我們求乙個點到其餘點的最短路;
dis[i]=2147483647;//
所以初始化全部賦為int的最大值;
dis[s]=0;//
起點到本身的的距離為0;
q[t]=s;//
起點入隊;
vis[s]=true;//
標誌改為true表示起點已入隊;
spfa(); //
執行最短路;
for(int i=1;i<=n;i++)//
迴圈輸出答案;
printf("
%d "
,dis[i]);
return0;
}
前向星和鏈式前向星
我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...
前向星和鏈式前向星
前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...
前向星和鏈式前向星
1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...