gpt4 book ai didi

c++ - 有没有人看过 2-Sat 的实现

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:40 25 4
gpt4 key购买 nike

我已经找了一段时间了,但似乎找不到 2-Sat 算法的任何实现。

我在 c++ 中使用 boost 库(它有一个 strongly connected component module )并且需要一些指导来创建一个高效的 2-Sat 程序或找到一个现有的库供我通过 c++ 使用。

最佳答案

我想您知道如何为 2-Sat 问题建模以使用 SCC 解决它。我处理 vars 及其否定的方式不是很优雅,但允许一个简短的实现:给定 n 个变量,编号从 0 到 n-1,在子句中 -i 表示变量 i 的否定,在图中 i+n 表示相同(我明白了吗?)

#include <boost/config.hpp>
#include <iostream>
#include <vector>
#include <boost/graph/strong_components.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/foreach.hpp>

typedef std::pair<int, int> clause;

//Properties of our graph. By default oriented graph
typedef boost::adjacency_list<> Graph;


const int nb_vars = 5;

int var_to_node(int var)
{
if(var < 0)
return (-var + nb_vars);
else
return var;
}

int main(int argc, char ** argv)
{
std::vector<clause> clauses;
clauses.push_back(clause(1,2));
clauses.push_back(clause(2,-4));
clauses.push_back(clause(1,4));
clauses.push_back(clause(1,3));
clauses.push_back(clause(-2,4));

//Creates a graph with twice as many nodes as variables
Graph g(nb_vars * 2);

//Let's add all the edges
BOOST_FOREACH(clause c, clauses)
{
int v1 = c.first;
int v2 = c.second;
boost::add_edge(
var_to_node(-v1),
var_to_node(v2),
g);

boost::add_edge(
var_to_node(-v2),
var_to_node(v1),
g);
}

// Every node will belong to a strongly connected component
std::vector<int> component(num_vertices(g));
std::cout << strong_components(g, &component[0]) << std::endl;

// Let's check if there is variable having it's negation
// in the same SCC
bool satisfied = true;
for(int i=0; i<nb_vars; i++)
{
if(component[i] == component[i+nb_vars])
satisfied = false;
}
if(satisfied)
std::cout << "Satisfied!" << std::endl;
else
std::cout << "Not satisfied!" << std::endl;
}

关于c++ - 有没有人看过 2-Sat 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1733656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com