1. 程式人生 > >鄰接表來儲存一個圖

鄰接表來儲存一個圖

//用鄰接表來儲存一個圖
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都是記錄的邊的編號
*/