public override int CheckTerminalPre(State state, int child_num) { StateFrontier st = (StateFrontier)state; if (child_num == 0) { // Lo枝のとき return(-1); } else { // Hi枝のとき Edge edge = state.GetCurrentEdge(); if (mate_array_[edge.src] == 0 || mate_array_[edge.dest] == 0) { // 分岐が発生 return(0); } else if (mate_array_[edge.src] == edge.dest) { // サイクルが完成 // フロンティアに属する残りの頂点についてチェック for (int i = 0; i < st.GetNextFrontierSize(); ++i) { int v = st.GetNextFrontierValue(i); // 張った辺の始点と終点、及びs,tはチェックから除外 if (v != edge.src && v != edge.dest) { // パスの途中でなく、孤立した点でもない場合、 // 不完全なパスができることになるので、0を返す if (mate_array_[v] != 0 && mate_array_[v] != v) { // v の次数が 1 return(0); } } } return(1); } else { return(-1); } } }
public override int CheckTerminalPost(State state) { StateFrontier st = (StateFrontier)state; for (int i = 0; i < st.GetLeavingFrontierSize(); ++i) { int v = st.GetLeavingFrontierValue(i); // フロンティアから抜ける頂点 v if (mate_array_[v] != 0 && mate_array_[v] != v) { // v の次数が 1 return(0); } } if (state.IsLastEdge()) { return(0); } else { return(-1); } }
public static void SetState(StateFrontier state) { state_ = state; }