無向圖的DFS遍歷(方法之一)

 

若是看不懂輔助解釋在後面第5


 

一、錄入方式:

 

輸入 u - v  表示一邊的2個端點函數

二、存儲結構

struct edge
{
    int from;
    int to;
    int next;
} e[MAXN];

int head[MAXN];   //head[u]表示 以u爲父節點的邊鏈表的頭

 

三、建圖方法

void build(int u, int v)
{
    e[cnt].from = u;
    e[cnt].to = v;
    e[cnt].next = head[u];// next = 以前u爲父節點的邊的編號
    head[u] = cnt;//更新head[u]
    cnt++;
}

        cin>>u>>v;
        build(u,v);
        build(v,u);    

四、DFS函數編寫

void dfs(int u)
{
    int edge = head[u];
    for(int i = edge; i != -1; i = e[i].next )
    {
        vis[u] = 1;
        int v = e[i].to;
        if(vis[v] == 0)
        {
            dfs(v);
        }
    }
    return ;
}

 


五、一些解釋:

 整體方法是head[u]存放以u(頂點)爲from的邊的編號,經過head[u]找到一條邊,而且這條邊是 一系列以u爲from的邊 組成的鏈表的頭,經過這個頭用鏈表的方式(e[i].next)去遍歷全部以u爲from的邊  。  因此數據類型是這樣的 : head[頂點編號] = 邊的編號 ;   e[邊的編號].next = 邊的編號 。ui

相關文章
相關標籤/搜索