鏈式前向星

2022-05-11 04:32:14 字數 1924 閱讀 1248

#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,int

z) 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 ...