1. 程式人生 > >陣列建立鄰接表的方法

陣列建立鄰接表的方法

具體的思路是,在建立鄰接表時,記錄的不是點而是邊,對於每一個點所對應的鄰接表都是以的形式儲存的,也就是說先新增的邊在遍歷時後取出,除此以外,所有的邊用一個結構體陣列儲存起來,每條邊對應的索引就是其編號,在建立鄰接表時,表中存放的實質是邊的編號,在遍歷時先獲得編號,在放回結構體陣列中獲得相應的邊的資料。

下面用具體程式碼解釋一下:

int top=0;//用來確定當前邊的編號
int head[MAX_N]=-1;//MAX_N是點的最大數目,該陣列用來存放每一個點在建立鄰接表時,棧頂的邊的編號
struct Edge//邊的結構體
{
    int v;//邊所連線的點
    int next;//在棧中的底下一條邊的編號
}e[MAX_E];//MAX_E是邊的最大數目,當圖為無向圖時,對一條邊的兩個端點建立鄰接表時,
          //均會記錄該邊,因此,同一條邊會被記錄兩次
void addEdge(int u,int v)//在u點的鄰接表中加入一條邊,也就是在棧頂加入一條邊
{
    e[top].v=v;
    e[top].next=head[u];//在u頂點的鄰接表這個棧的頂部加入一條邊(頭插法)
    head[u]=top++;//top為加入邊的編號,加入後要更新head,使得head記錄鄰接表棧頂邊的編號
}
void bfs()//遍歷鄰接表
{
    for(int i=0;i<n;i++)//遍歷所有點
    {
        for(int j=head[i];j!=-1;j=e[j].next)//j=head[i]:獲取當前點鄰接表的棧頂的邊的編號
        {                                   //j=e[j].next:獲取棧中底下一條邊的編號,j==-1表示遍歷完
            //操作
        }
    }
}