有人可以解释一下这个结构吗?

时间:2017-07-17 15:59:50

标签: c++ struct graph-theory

我正在研究图论算法。我知道什么是图形,什么是边缘等。我在c ++中有这个脚本的第一部分,它声明了一些变量和一些结构,并在它定义了一个添加边缘的函数之后。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

const int M = 500;
struct struct_edge
{
    int v; 
    struct_edge * n;  
};

typedef struct_edge * edge;  
struct_edge pool[M * M * 2]; 
edge top = pool, adj[M];    
int V, E, match[M], qh, qt, q[M], father[M], base[M];   
bool inq[M], inb[M], ed[M][M];   
void add_edge(int u, int v)
{
    top->v = v, top->n = adj[u], adj[u] = top++;
    top->v = u, top->n = adj[v], adj[v] = top++;
}

如果这还不够,我会把脚本的另一部分放进去。 我有一些问题需要理解为什么struct_edge有一个指向另一个struct_edge的指针(它的边缘不是节点!)。我有一些严重的问题要理解这个声明:     edge top = pool,adj [M]; top是指向struct_edge的指针,它有一个struct数组和一个int数组在内部?!? 有关完整代码,您可以看到此链接 http://codeforces.com/blog/entry/49402

1 个答案:

答案 0 :(得分:2)

要回答第一个问题,图表将存储为邻接列表格式。每个节点都有一个关联的链接列表边缘(struct_edge),每个边缘都有一个索引(int v;)到边缘末端的节点,以及一个指针到下一个边缘(struct_edge* n;)。索引是adj[M]数组,它存储构成图形的M个节点。

第二个问题,pool是静态声明的struct_edge数组,OP使用它来创建堆栈分配器,即通过递增{分配新节点{1}},它是指向堆栈顶部的指针。 top初始化为top,它是堆栈的基础(数组的开头)。

编辑:您链接的维基媒体图表的指针排列图表:

enter image description here

(注意索引从0开始而不是1,因此图表中的节点1对应于代码中的pool