1. 程式人生 > >【C++學習筆記】 鏈式前向星

【C++學習筆記】 鏈式前向星

strong align 出發 max 當前 ret return clu ali

 鏈式前向星是一種常見的儲存圖的方式(是前向星存圖法的優化版本),支持增邊和查詢,但不支持刪邊(如果想要刪除指定的邊建議用鄰接矩陣)。

  • 儲存方式

  首先定義數組 head[ i ] 來儲存從節點 i 出發的第一條邊的下標,定義結構體 edge[ i ] 中包含三個元素 nxt, to, val, 分別儲存從節點 i 出發的下一條邊的下標(nxt),該邊的終點(to), 該邊的邊權(val)。

1 struct EDGE {
2     int nxt, to, val;    /* 下一條邊的下標, 這條邊的終點, 邊權 */ 
3 };
4 EDGE edge[maxn];
5 
6 int
head[maxn]; /* head[ i ]儲存從節點 i 出發的第一條邊的下標 */
  • 添加節點

  定義變量 cnt 表示當前邊的編號(初始值為0),具體如代碼所示。

 1 int cnt = 0;
 2 
 3 void add ( int st, int ed, int v ) {
 4     edge[ ++cnt ].nxt = head[st];
 5     edge[cnt].to = ed;
 6     edge[cnt].val = v;
 7     head[st] = cnt;
 8 
 9 /*    
10     edge[ ++cnt ].nxt = head[ed];    * 如果是無向圖就加上這個語句 
11 edge[cnt].to = st; 12 edge[cnt].val = v; 13 head[ed] = cnt; 14 15 */ 16 17 }
  • 節點的遍歷

  從數據結構就可以看出來,上代碼。

1 /* i 是作為原點的節點編號 */
2 for ( int j = head[i]; j != 0 ; j = edge[j].nxt )  /* <-- 鏈式前向星遍歷的關鍵 */
3         printf ( "-->%d || val = %d \n", edge[j].to, edge[j].val );
4     }
  • 匯總代碼
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 const int maxn = 2018702;
 7 
 8 struct EDGE {
 9     int nxt, to, val;    /* 下一條邊的下標, 這條邊的終點, 邊權 */ 
10 };
11 EDGE edge[maxn];
12 
13 int head[maxn], cnt = 0; /* head[ i ]儲存從節點 i 出發的第一條邊的下標 */
14 
15 void add ( int st, int ed, int v ) {
16     edge[ ++cnt ].nxt = head[st];
17     edge[cnt].to = ed;
18     edge[cnt].val = v;
19     head[st] = cnt;
20 
21 /*    
22     edge[ ++cnt ].nxt = head[ed];    * 如果是無向圖就加上這個語句 
23     edge[cnt].to = st; 
24     edge[cnt].val = v;
25     head[ed] = cnt;
26 
27 */
28 
29 }
30 
31 int main () {
32     memset ( head, 0, sizeof head );
33     int n, m;
34     scanf ( "%d%d", &m, &n ); /* 共有 m 個節點, n 條邊 */
35     for ( int i = 1; i <= n; i ++ ){
36         int a, b, c;
37         scanf ( "%d%d%d", &a, &b, &c );
38         add ( a, b, c );
39     }
40     for ( int i = 1; i <= m; i ++ ){
41         printf ( "開始以節點%d為原點\n", i );
42         for ( int j = head[i]; j != 0 ; j = edge[j].nxt ) /* <-- 鏈式前向星遍歷的關鍵 */
43         printf ( "-->%d || val = %d \n", edge[j].to, edge[j].val );
44     }
45     return 0;
46 }

【C++學習筆記】 鏈式前向星