陣列建立鄰接表的方法
阿新 • • 發佈:2019-02-09
具體的思路是,在建立鄰接表時,記錄的不是點而是邊,對於每一個點所對應的鄰接表都是以棧的形式儲存的,也就是說先新增的邊在遍歷時後取出,除此以外,所有的邊用一個結構體陣列儲存起來,每條邊對應的索引就是其編號,在建立鄰接表時,表中存放的實質是邊的編號,在遍歷時先獲得編號,在放回結構體陣列中獲得相應的邊的資料。
下面用具體程式碼解釋一下:
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表示遍歷完 //操作 } } }