鄰接表來儲存一個圖
阿新 • • 發佈:2018-11-04
//用鄰接表來儲存一個圖 int n, m, i; int u[6], v[6], w[6]; int first[5], next[5]; scanf("%d%d", &n, &m); //初始化first陣列下標1~n的值為-1, 表示1~n頂點暫時都沒有邊 for(i = 1; i <= n; ++i) first[i] = -1; for(i = 1; i <= m; ++i) { scanf("%d %d %d", &u[i], &v[i], &w[i]); //讀入每一條邊 //下面兩句是關鍵啦 next[i] = first[u[i]]; first[u[i]] = i; } //遍歷每個頂點的邊 for(i = 1; i <= n; ++i) { k = first[i]; while(k != -1) { printf("%d %d %d\n", u[k], v[k], w[k]); k = next[k]; } } /* first[i]:以i為起點的邊的編號,沒有的話設為-1 next[i]:編號為i的邊的前一條邊的編號,同樣的,沒有也設為-1 (前一條邊:與當前邊(也就是i)同一個起點的邊,只不過是比i早搜到,早儲存) first[i]再儲存完之前一直存的是搜到的第一條以i為起點的邊的編號, but,如果有另一條以i為起點的邊, 則next[另一條以i為起點的邊的編號]=第一條以i為起點的邊的編號,記錄了兩次, ∴若以i為起點的邊>=3(反正就是比較多,不一定>=3), 則它可以存最後搜到的以i為起點的邊的編號 遍歷邊的時候,其實是取的邊的編號 總之,first和next都是記錄的邊的編號 */