2-SAT模板
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAFCUlEQVR42n2VeVCUdRzGf3n0T/80ldqITqk0gGhrXqSjTjbTaDWalVhOajp5pOMR3gjqeuExaDKYCKmJqSCGgQZIyaFQKseC67ELHhwSrC7HGpTG7r6f3u86iISyM8+8z3y/z/N5d993dn4KaKcso+rS4pXiOdtMNbBhqZpxf5UKFYmXmezad1rVHi4hCausLvdD1OKmncr8MNZP47cv4cJyROJlJjvJSLal+2x4guos19pl/sOawpWZ9Alw4wDYMsBR4KLR3CwSLzPZSUay0nmSIWr3jRtCvSc+iFZQtBrsZ3XQRRf1uRp156AuG5F4mclOMpKVjnSfZLV5XjVB/sMfxCgoXgH2lGZsyVD9E9Qkgu1kG8lMdpKRrHSkK4wWpgLleSlGFfh8U4S6wh8ToHJ/s1axH60iBu7s71CSkax0pNuoM4QlzMc/oW7ja0tJ7QFXv2nm9g69uBUqt8GtsI4lGclKR7opPajb9HrQ48eifzo3RvW8Ru5wsC5ycXMZltPTufrLLChdhmYJAuvSNpKZ7CQjWelIVxjCEqYHXv71i289PNIHLo2Gq9O0uA0B7Fk7Ftul2WDVi+apaMWfweUpiMTLTHaSkax0pCsMYQnTA682vjSbM/5gGu06tXUAyVEjwPo+jvOjsP06HGfeSCgehZY3ApF4mclOMljHIx3pCkNYNp3pgdu3vLKRnEE0ZLzjzIz1pexML5YEzmPxe0MxTlJs/rwHJScGg2mMSLzMZKdnhrA4cAG30/qQFfuGzhjrFJYwPfDasG6byBwGhV2d97ICCN6dzrvhVm6cncpfpgDMqWMwJQ0F00hERbo3p47WdyO4nTGZ8TstBEdmUJMxBgqUk8yh1Ib12OSBV67znk+64vKJJa71x69RWA+Hs8uwxivcBQqu94JSb7jaB0Ql/fRrT1z5Ckuc4lDmTYocsP6ElcLjy12kKSo39J3vgTtWqyFxO3Zrn6TWc+4emgTXJljYunK1/rJmExU6iR/Wv82xLQaObTZwcN1IotZ8TOTaeWxbFUxI/DVMDZBjR5uS7iB22x7sK9VQD1wNi/H3i690nrgDF+65tfQqjRXHLRSaiqmsqqbGVou9tgGHo4mGhkbs9nqqa+yUV1aRX1DI8rhrpOkd6SZWwcCEKrca96PhEXxO2rjgi3+TUkNzjs2tRVg0fFemsGvuKA5FR3AmJZkiUwGlJRZKdBUW5JF66iQHvgsnfNYgvJcmsfO6Rs5dt5Zazb+heQ9QC9InPIKrFa9OjrM6Dv8JkTdwGZLuug9EBpE0U5E4Q3FkumLfp4rIibo+UkRPVhzV54lfKJLmKI7FLGRgYo07ohSXMALjrI1KhXgpZaQToNS8ox8E7CvMD4rOJjt+DZR1dZVkDyYt1Jfc0P4UhPlh2u6LKH+LHzkh/Ukz+nDr9yFQ3tWZG7+CZVEZDN+bn6fmxn3Y+ven9UTJnqoWaT8rMBugwuCstQxwm073085F9yZzlxeZ33px/vveXE7tpzVYB7i5/aaTYgOcVOROUwuBx8zWUyMhoXOLz/pq0KS6mF4V5PpAyUC5Ca47g1z/lBucIvGUG8AyAHJ8qIvxqjird/7PanvmKWMnEKF8lOpZurH79rqDvSqaT/WFi75g7o9IfHNyX2Rn3dB9R289Kx3pyrn6zDO03VGlVLez014Yf2XNy8FlW7rvFYmXmeye1ukQLjIaVScQoTqSZCT7tN1/5TypNXepA58AAAAASUVORK5CYII=" alt="" />
按字典序输出 直接dfs就好了(hdu1814(抄自 http://www.cnblogs.com/kuangbin/archive/2012/10/05/2712429.html)
#include <bits/stdc++.h>
using namespace std; const int MAXN = ;
const int MAXM = ; struct Edge {
int to, next;
} edge[MAXM];
int head[MAXN], cntE; void init() {
cntE = ;
memset(head, -, sizeof head);
} void addedge(int u, int v) {
edge[cntE].to = v;
edge[cntE].next = head[u];
head[u] =cntE++;
} bool vis[MAXN];
int stk[MAXN], top;
bool dfs(int u) {
if (vis[u^]) return false;
if (vis[u]) return true;
vis[u] = true; stk[top++] = u;
for (int i = head[u]; ~i; i = edge[i].next) {
if (!dfs(edge[i].to)) return false;
}
return true;
} bool sat(int n) {
memset(vis, false, sizeof vis);
for (int i = ; i < n; ++i) {
if (vis[i] || vis[i ^ ]) continue;
top = ;
if (!dfs(i)) {
while (top) vis[stk[--top]] = false;
if (!dfs(i^)) return false;
}
}
return true;
} int main() {
int n, m;
int u, v;
while (~scanf("%d%d", &n, &m)) {
init();
while (m--) {
scanf("%d%d", &u, &v);
u--, v--;
addedge(u, v^); //选u就必须选择v^1
addedge(v, u^);
}
n *= ;
if (sat(n)) {
for (int i = ; i < n; ++i) {
if (vis[i]) printf("%d\n", i+);
}
} else {
printf("NIE\n");
}
}
return ;
}
输出任意一组解
const int N = ;
const int M = ; struct Edge {
int from, to, next;
} edge[M], edge2[M];
int head[N];
int cntE, cntE2;
void addedge(int u, int v) {
edge[cntE].from = u; edge[cntE].to = v; edge[cntE].next = head[u]; head[u] = cntE++;
}
void addedge2(int u, int v) {
edge2[cntE2].from = u; edge2[cntE2].to = v; edge2[cntE2].next = head[u]; head[u] = cntE2++;
} int dfn[N], low[N], idx;
int stk[N], top;
int in[N];
int kind[N], cnt; void tarjan(int u)
{
dfn[u] = low[u] = ++idx;
in[u] = true;
stk[++top] = u;
for (int i = head[u]; i != -; i = edge[i].next) {
int v = edge[i].to;
if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
else if (in[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++cnt;
while () {
int v = stk[top--]; kind[v] = cnt; in[v] = false;
if (v == u) break;
}
}
} int opp[N], ind[N], col[N]; // 相对的点 入度 染色 col[]=1选择 bool topsort(int n) // 序号从0开始
{
for (int i = ; i < *n; i += ) {
int k1 = kind[i]; int k2 = kind[i^]; // 相对的两个点
if (k1 == k2) return false;
opp[k1] = k2; opp[k2] = k1;
}
memset(head, -, sizeof head);
int u, v;
for (int i = ; i < cntE; ++i) {
u = edge[i].from, v = edge[i].to;
if (kind[u] != kind[v]) { // 反向建图
addedge2(kind[v], kind[u]);
ind[kind[u]]++;
}
}
queue<int> q;
for (int i = ; i <= cnt; ++i) if (!ind[i]) q.push(i);
while (q.size()) {
u = q.front(); q.pop();
if (!col[u]) col[u] = , col[ opp[u] ] = -;
for (int i = head[u]; i != -; i = edge2[i].next)
if (--ind[edge2[i].to] == ) q.push(edge2[i].to);
}
return true;
} void init() {
cntE = cntE2 = ;
memset(head, -, sizeof head);
memset(dfn, , sizeof dfn);
memset(in, false, sizeof in);
idx = top = cnt = ;
memset(ind, , sizeof ind);
memset(col, , sizeof col);
}
2-SAT模板的更多相关文章
- 2 - sat 模板(自用)
2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一 POJ 3207 Ikki's Story IV ...
- TwoSAT算法模板
该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真” 等价于 “Xi为假 –& ...
- C++ 模板基础
我们学习使用C++,肯定都要了解模板这个概念.就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数:进而实现了真正的代码可重用性.模版可 ...
- (模板)poj2947(高斯消元法解同余方程组)
题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...
- 虚拟化技术之kvm镜像模板制作工具virt-sysprep
virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动:什么是镜像模板呢?所谓模板就是 ...
- Jade模板引擎让你飞
写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
随机推荐
- 【leetcode】Longest Common Prefix (easy)
Write a function to find the longest common prefix string amongst an array of strings. 思路:找最长公共前缀 常规 ...
- HDU 2159 FATE (DP 二维费用背包)
题目链接 题意 : 中文题不详述. 思路 : 二维背包,dp[i][h]表示当前忍耐值为i的情况下,杀了h个怪得到的最大经验值,状态转移方程: dp[i][h] = max(dp[i][h],dp[i ...
- SSH hibernate 使用时最好添加访问数据库的编码
SSH hibernate 使用时最好添加访问数据库的编码 如下所示:第13行为设置hibernate访问数据库的编码(&是&的转义序列) <!DOCTYPE hibernate ...
- 到底该不该熟悉掌握struts2的ONGL呢?
其实,在学习网站开发过程中,其实不掌握ONGL也是可以的.我们完全可以使用JSTL和EL来代替OGNL. 只要存在要往页面传输内容,我们直接把对象放在request范围即可,这样我们就可以在jsp中使 ...
- Ubuntu安装已经下载好的文件包
默认的文件下载都在 ~/Downloads 文件夹里面. 按 ctrl+alt+t 打开命令. 1.解压下载好的文件包,如: tar -xvf Sublime\ Text\ 2.0.2.tar.bz2 ...
- C++ 类的内存分布
C++类内存分布 转自:http://www.cnblogs.com/jerry19880126/p/3616999.html 先写下总结,通过总结下面的例子,你就会明白总结了. 下面总结一下: ...
- 函数fseg_create_general
申请一个段 /**********************************************************************//** Creates a new segm ...
- Java web 项目 tomcat部署方式.
本地做Java Web项目的时候常常会用到tomcat部署测试的问题, 这里介绍项目的部署方法: 1,配置文件的形式: 例如: 你的项目目录为:f:\workspaces\MyProject,此时使用 ...
- Java和.NET在开发中的不同盘点
我是用VS2008和VS2010开发.NET程序,通过MyEclipse8.5开发JAVA程序,下面从IDE.语言.插件的不同点来做下简单的说明.但由于经验知识还有限,本篇文章只能从比较表面的以及自己 ...
- Self-Paced Training (2) - Docker Fundamentals
Agenda- Building Images Dockerfile Managing Images and Containers Distributing Images on Docker Hub ...