- 9 名前:デフォルトの名無しさん [2008/04/16(水) 07:43:14 ]
- nodeinfo_t infoary[NODENUM]の説明
ノードのラベルと親ノードを、ノード-1の位置に記憶する ex. ノード3のラベルと親ノードは、infoary[2].label, infoary[2].parent infoary[x-1].label == 0 の場合、xは通過していないことになる analyze_depth: @空のスタック(stack_t stack={0})、初期化されたノード情報配列(nodeinfo_t infoary[NODENUM] = {{0}})を宣言 Aスタックにルートノード(start)をプッシュ : pushstack(&stack, start); Bルートノードを通過済みする : flags[start-1] = 1; Cルートノードのラベルを1に設定 : infoary[start-1].label = 1; ルートノードの親ノードを自分に設定 : infoary[start-1].parent = start; Dラベルを2に設定 : label = 2; Eスタックにデータ(親ノード)がある→F、 スタックが空→N Fスタックからノードを取り出す(親ノード) : parent = popstack(&stack); G親ノードから到達可能なノード(子ノード)が、ある→H、ない→E : for(i=0; adj[parent-1][i] != 0; ++i){ H子ノードが未通過→I、通過済み→G : if( flags[ adj[parent-1][i]-1 ] == 0){ I子ノードを通過済みにする : flags[ adj[parent-1][i]-1 ] = 1; Iスタックに親ノードをプッシュ : pushstack(&stack, parent); Jスタックに子ノードをプッシュ : pushstack(&stack, adj[parent-1][i]); K子ノードのラベルを設定 : infoary[ adj[parent-1][i]-1 ].label = label; 子ノードの親ノードを設定 : infoary[ adj[parent-1][i]-1 ].parent = parent; Lラベルを+1する : ++label; MEに戻る : break; Nラベルが0以外のノードを表示する printf(" v_label parent\n"); for(i=0; i < NODENUM; ++i){ if(infoary[i].label != 0){ printf("%2d : %7d %6d\n", i+1, infoary[i].label, infoary[i].parent); } } 上記間違いがあっても、当方は責任を負いかねます これで分からないなら、まずwikiで深さ優先探索、スタックをじっくり勉強してください
|

|