コード例 #1
0
        public bool IsSatisfiable(int verticesCount, Tuple<int, int>[] clauses)
        {
            _verticesCount = verticesCount;

            var vertices = Enumerable.Range(0, 2 * verticesCount).Select(nodeId => new KosarajuVertex(nodeId)).ToArray();

            clauses.ForEach(edge =>
                {
                    AddEdge(vertices, -edge.Item1, edge.Item2);
                    AddEdge(vertices, -edge.Item2, edge.Item1);
                });

            kosarajuSCC.CountStronglyConnectedComponentes(vertices);

            for (int i = 1; i <= verticesCount; i++)
            {
                if (vertices[GetIndexById(i)].Parent.Id.Equals(vertices[GetIndexById(-i)].Parent.Id))
                    return false;
            }

            return true;
        }