我无法为我的程序创建深度优先搜索。到目前为止,我有一类边缘和一类区域。我想将所有连接的边存储在我所在区域的一个节点内。我可以通过我已经实现的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
}
答案 0 :(得分:0)
假设n是边的总数,k是最终的区域数。 为必需的DFS创建邻接列表可能成本太高O(n ^ 2)(如果k = 1,即所有边都属于同一区域),因此dfs将花费你O(V + E),即O(n ^ 2)in最坏的情况。
否则问题很容易在O(n * log(k))中解决如下:
我猜这个问题不存在保证的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;
}