0

我无法为我的程序创建深度优先搜索。到目前为止,我有一类边和一类区域。我想将所有连接的边存储在我所在区域的一个节点内。我可以判断我已经实现的 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
 }
4

2 回答 2

0

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

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

  1. 遍历所有边,将它们添加到相应区域的头部(使用平衡 bst,例如 stl-map)[您也可以为此使用散列]
  2. 遍历所有区域并以必要的线性方式连接它们

我猜这个问题没有保证的 O(n) 解决方案。

于 2012-11-26T14:00:05.587 回答
0

我尝试实现一个邻接表创建功能。adj_list 结构的next 指针将你带下邻接表(next 连接的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;
}
于 2013-06-08T22:55:38.387 回答