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模板的更多相关文章

  1. 2 - sat 模板(自用)

    2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一  POJ 3207 Ikki's Story IV ...

  2. TwoSAT算法模板

    该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真”  等价于 “Xi为假 –& ...

  3. C++ 模板基础

    我们学习使用C++,肯定都要了解模板这个概念.就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数:进而实现了真正的代码可重用性.模版可 ...

  4. (模板)poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...

  5. 虚拟化技术之kvm镜像模板制作工具virt-sysprep

    virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动:什么是镜像模板呢?所谓模板就是 ...

  6. Jade模板引擎让你飞

    写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...

  7. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  8. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  10. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

随机推荐

  1. Visual C++ unicode and utf8 转换

    ATL宏: USES_CONVERSION; W2A A2W CString StringUtil::UTF8_to_UNICODE(const char *utf8_string, int leng ...

  2. 5.查找最小的k个元素(数组)

    题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想 ...

  3. xcode 树形管理 cocos2d-x的资源

    把资源以目录的形式加入xcode中, 同时, 在加入时, 选择"Create Folder References for any  added folders", 而不是默认的&q ...

  4. c++ string assign =

    C++ string类的成员函数,用于拷贝.赋值操作,它们允许我们顺次地把一个string 对象的部分内容拷贝到另一个string 对象上. string &operator=(const s ...

  5. PHP简单语法

    PHP简单语法 声明变量 $var_name="1"; $var_num=1; $var_bool=true; var_dump"函数可以将我们的变量的数据类型显示出来. ...

  6. PHP的执行原理/执行流程

    http://www.cnblogs.com/hongfei/archive/2012/06/12/2547119.html 更深入的学习和了解可以查看下面: 风雨的博客http://www.laru ...

  7. 跨平台的目录遍历实现方法(windows和linux已经测试)

    dirent.h是gcc下的一个头文件,在windows中是没有的.这个文件中封装了几个对目录进行操作函数: static DIR *opendir (const char *dirname);sta ...

  8. Fisher's exact test( 费希尔精确检验)

    Fisher's exact test[1][2][3] is a statistical significance test used in the analysis ofcontingency t ...

  9. 摄像头(2)调用系统拍照activity来录像

    import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager ...

  10. chrome渲染hover状态tranform相邻元素抖动bug

    最近同事在使用 css3 的 transition + tranform 的时候影响了相邻的元素出现bug.或者说相邻的元素出现抖动bug. 然而把 hover 状态的 tranform 属性删了后, ...