Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
 public static void SetState(StateFrontier state)
 {
     state_ = state;
 }