为DFS创建邻接列表

时间:2012-11-18 04:54:28

标签: c++ algorithm depth-first-search

我无法为我的程序创建深度优先搜索。到目前为止,我有一类边缘和一类区域。我想将所有连接的边存储在我所在区域的一个节点内。我可以通过我已经实现的getKey()函数判断是否连接了某些东西。如果两条边具有相同的键,则它们连接在一起。对于下一个区域,我想在该区域内存储另一组连接边缘等。但是,我并不完全了解DFS,我在实现它时遇到了一些麻烦。我不确定何时/何地再次调用DFS。任何帮助将不胜感激!

class edge
{ 
  private:
  int source, destination, length;
  int key;
  edge *next;
  public:
  getKey(){ return key; } 
}

class region
{
   edge *data;
   edge *next;
   region() { data = new edge(); next = NULL; }

};

void runDFS(int i, edge **edge, int a)
{
  region *head = new region();
  aa[i]->visited == true;//mark the first vertex as true
  for(int v = 0; v < a; v++)
  {
    if(tem->edge[i].getKey() == tem->edge[v].getKey()) //if the edges of the vertex have the same root
    {
        if(head->data == NULL)
        {
          head->data = aa[i];
          head->data->next == NULL;
        } //create an edge
        if(head->data)
        {
          head->data->next = aa[i];
          head->data->next->next == NULL;
        }//if there is already a node connected to ti
    }
    if(aa[v]->visited == false)
      runDFS(v, edge, a); //call the DFS again
  } //for loop
 }

2 个答案:

答案 0 :(得分:0)

假设n是边的总数,k是最终的区域数。 为必需的DFS创建邻接列表可能成本太高O(n ^ 2)(如果k = 1,即所有边都属于同一区域),因此dfs将花费你O(V + E),即O(n ^ 2)in最坏的情况。

否则问题很容易在O(n * log(k))中解决如下:

  1. 遍历所有边缘,将它们添加到相应区域的头部(使用平衡bst,例如stl-map)[你也可以使用散列]
  2. 遍历所有区域并以必要的线性方式连接它们
  3. 我猜这个问题不存在保证的O(n)解决方案..

答案 1 :(得分:0)

我试图实现一个邻接列表创建函数.all_list结构的下一个指针将你拉下邻接列表(下一个连接的2个节点之间没有关系),列表指针是邻接列表。该节点具有adj_list的地址,该地址具有邻接列表。

struct node{
    int id;
    adj_list* adj;

};


struct adj_list{
    adj_list* next;
    adj_list* list;
    node* n;
    adj_list(node& _n){
        n = &(_n);
        next = NULL;
        list = NULL;
    }
};

node* add_node(int id,std::queue<int> q , node* root)
{
    node* n = new node(id);
    adj_list* adj = new adj_list(*n);
    n->adj = adj;

    if(root == NULL){
      return n;
    }
    std::queue<adj_list*> q1;

    while(1){
        adj_list* iter = root->adj;
        if(q.empty())break;
        int k = q.front();
        q.pop();
        while(iter){    
            if(iter->n->id == k){
                q1.push(iter);
                adj_list*  temp = iter->list;
                iter->list = new adj_list(*n);
                break;
            }
            iter = iter->next;
        }
    }

    adj_list* iter = root->adj;
    while(iter->next){
        iter = iter->next;
    }

    iter->next = adj;

    while(!q1.empty()){
        adj_list* temp = q1.front();
        q1.pop();
        adj->list = temp;
        adj = temp;
    }
    return root;
}