次の奥行き検索の再帰的実装があります。最後に、配列preはいくつかの頂点がどの順序で訪問されたかを示します。私は本当に大きなグラフのためにそれを実行したい。この例では、n = 2097152、m = 6291408です.Gは隣接リストとして表されます。深さ優先のセグメンテーションフォールトで大きなグラフを検索する
static int cnt, pre[2097152];
static link t;
void dfsRAdjazenz(Graph G, Edge e)
{
int w = e.w
pre[w] = cnt++;
for (t = G->adj[w]; t != NULL; t = t->next) {
if (pre[t->v] == -1) {
Edge e = {w, t->v};
dfsRAdjazenz(G, e);
}
}
}
int main (int argc, const char * argv[])
{
cnt=0;
int v;
for (v = 0; v < 2097152; v++) {
pre[v] = -1;
}
Edge e = {1,1};
dfsRAdjazenz(G, e);
return 0;
}
私はいつもメモリが不足しています - >セグメンテーションフォールト、実際には十分なメモリがあります。それはちょうど約100万のノードのために働く。
編集:データ構造:
typedef struct node *link;
struct node {
int v;
link next;
};
struct graph {
int V;
int E;
link *adj;
};
typedef struct {
int v;
int w;
} Edge;
typedef struct graph *Graph;
なぜ、私たちから最も重要なコード、すなわち 'Graph'と' Edge'の定義が隠れているのですか?これは推測ゲームですか?その答えはおそらく「あなたはあなたのデータ構造を間違って使用していますが、正確にあなたが*投稿していない情報です。 –
「n」と「m」は何を表していますか? – Zoozy
sry、私はそれを更新しました。 n =ノード、m =エッジ – ItsameMario