首页 > 其他分享 >D35【模板】2-SAT

D35【模板】2-SAT

时间:2024-08-02 10:17:25浏览次数:9  
标签:head idx int D35 ++ dfn low 模板 SAT

视频链接:D35【模板】2-SAT_哔哩哔哩_bilibili

 

 

 

D14 强连通分量 Tarjan 算法 - 董晓 - 博客园 (cnblogs.com)

P4782 【模板】2-SAT - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 2-SAT+tarjan O(n+m)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=2000005;
int n,m;
int head[N],to[N],ne[N],idx;
int dfn[N],low[N],tim,stk[N],top,scc[N],cnt;

void add(int a,int b){
  to[++idx]=b,ne[idx]=head[a],head[a]=idx;
}
void tarjan(int x){
  dfn[x]=low[x]=++tim;
  stk[++top]=x;
  for(int i=head[x];i;i=ne[i]){
    int y=to[i];
    if(!dfn[y]){ //若y尚未访问
      tarjan(y);
      low[x]=min(low[x],low[y]);
    }
    else if(!scc[y]) //若y已访问且未处理
      low[x]=min(low[x],dfn[y]);
  }
  
  if(low[x]==dfn[x]){ //若x是SCC的根
    ++cnt;
    for(int y=-1;y!=x;) scc[y=stk[top--]]=cnt;
  }
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i,a,j,b;m--;){
    scanf("%d%d%d%d",&i,&a,&j,&b);
    add(i+!a*n,j+b*n); //xi拆成i和i+n
    add(j+!b*n,i+a*n);
  }
  
  for(int i=1;i<=2*n;i++)
    if(!dfn[i]) tarjan(i); //求SCC
  for(int i=1;i<=n;i++)
    if(scc[i]==scc[i+n]){
      puts("IMPOSSIBLE");
      return 0;
    }
  puts("POSSIBLE");
  for(int i=1;i<=n;i++)
    printf("%d ",scc[i]>scc[i+n]);
}

 

// 2-SAT+tarjan O(n+m)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=2000005;
int n,m;
int head[N],to[N],ne[N],idx;
int dfn[N],low[N],tim,stk[N],top,scc[N],cnt;

void add(int a,int b){
  to[++idx]=b,ne[idx]=head[a],head[a]=idx;
}
void tarjan(int x){
  dfn[x]=low[x]=++tim;
  stk[++top]=x;
  for(int i=head[x];i;i=ne[i]){
    int y=to[i];
    if(!dfn[y]){ //若y尚未访问
      tarjan(y);
      low[x]=min(low[x],low[y]);
    }
    else if(!scc[y]) //若y已访问且未处理
      low[x]=min(low[x],dfn[y]);
  }
  
  if(low[x]==dfn[x]){ //若x是SCC的根
    ++cnt;
    for(int y=-1;y!=x;) scc[y=stk[top--]]=cnt;
  }
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i,a,j,b;m--;){
    scanf("%d%d%d%d",&i,&a,&j,&b);
    i--,j--;
    add(2*i+!a,2*j+b); //xi拆成2i和2i+1
    add(2*j+!b,2*i+a);
  }
  
  for(int i=0;i<2*n;i++)
    if(!dfn[i]) tarjan(i); //求SCC
  for(int i=0;i<2*n;i+=2)
    if(scc[i]==scc[i+1]){
      puts("IMPOSSIBLE");
      return 0;
    }
  puts("POSSIBLE");
  for(int i=0;i<2*n;i+=2)
    printf("%d ",scc[i]>scc[i+1]);
}

 

板子题:P4171 [JSOI2010] 满汉全席 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=205;
int t,n,m;
int head[N],idx;
struct Edge{int to,ne;}e[4005];
int dfn[N],low[N],tim,stk[N],top,scc[N],cnt;
char s1[5],s2[5];
 
void add(int a,int b){
  e[++idx].to=b;
  e[idx].ne=head[a];
  head[a]=idx;
}
void tarjan(int x){
  dfn[x]=low[x]=++tim;
  stk[++top]=x;
  for(int i=head[x];i;i=e[i].ne){
    int y=e[i].to;
    if(!dfn[y]){ //若y尚未访问
      tarjan(y);
      low[x]=min(low[x],low[y]);
    }
    else if(!scc[y]) //若y已访问且未处理
      low[x]=min(low[x],dfn[y]);
  }
  
  if(low[x]==dfn[x]){ //若x是SCC的根
    ++cnt;
    for(int y=-1;y!=x;) scc[y=stk[top--]]=cnt;
  }
}
int main(){
  scanf("%d",&t);
  while(t--){
    idx=tim=cnt=top=0;
    memset(head,0,sizeof head);
    memset(dfn,0,sizeof dfn);    
    memset(scc,0,sizeof scc);
    scanf("%d%d",&n,&m);
    while(m--){
      scanf("%s%s",&s1,&s2);
      int i=0,j=0,a,b,k;
      a=(s1[0]=='m'?0:1);
      b=(s2[0]=='m'?0:1);
      for(k=1;s1[k]>='0'&&s1[k]<='9';)
        i=i*10+s1[k++]-'0';
      for(k=1;s2[k]>='0'&&s2[k]<='9';)
        j=j*10+s2[k++]-'0';
      add(i+n*!a,j+n*b); 
      add(j+n*!b,i+n*a);
    }
    
    for(int i=1;i<=n<<1;++i)if(!dfn[i])tarjan(i);
    bool flag=0;
    for(int i=1;i<=n;++i)
      if(scc[i]==scc[i+n]){
        flag=1; break;
      }
    flag?puts("BAD"):puts("GOOD");
  }
}

 

练习题:

Catowice City - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P3007 [USACO11JAN] The Continental Cowngress G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Ring Road 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

标签:head,idx,int,D35,++,dfn,low,模板,SAT
From: https://www.cnblogs.com/dx123/p/18330744

相关文章

  • 转转交易猫自带客服多模板全开源完整定制版源码
    转转交易猫自带客服多模板全开源完整定制版源码。请在后台商品添加成功后,再点击该商品管理,可重新编辑当前商品的所有信息及配图以及支付等等相关信息可点击分享或者跳转,将链接地址进行发布分享请在手机端打开访问访问商品主要模板文件路径目录咸鱼;http://你的域名地址/Xia......
  • 创建xtrbackup备份用户 ERROR 1819 (HY000): Your password does not satisfy the cur
    查看密码策略mysql>SHOWVARIABLESLIKE'validate_password%';+--------------------------------------+--------+|Variable_name|Value|+--------------------------------------+--------+|validate_password_check_user_name......
  • 易优CMS模板标签switch条件判断支持多条件判断
    【基础用法】标签:switch描述:简单条件判断,比if判断标签少些不等于相同功能,视个人习惯而用。用法:{eyou:switchname='$eyou.field.has_children'}{eyou:casevalue='1'}当前栏目列表的栏目ID有1个下级栏目{/eyou:case}{eyou:casevalue='2'}当前栏目列表的栏目ID有2个下级栏目{/e......
  • 易优CMS模板标签relevarticle相关文档
    [基础用法]标签:relevarticle描述:通过前3个TAG标签或前3个关键词,检索整站文档标题中含有tag标签或者关键词的相关文档,进行关联。在没有tag标签情况下,就以前3个关键词检索文档标题进行关联。这个标签随着数据量的增加可能会比较影响检索性能。提示:使用该标签之前,必须先安装相关文......
  • 模板方法模式
    上层抽象类定义好操作的基本框架,一些特殊的子操作交给子类去实现,使得子类可以在不改变上层基类的情况下,可以定制操作的某一步骤。抽象类:模版方法:定义操作的骨架基本方法抽象方法:交给子类实现具体方法:基类自己实现,子类也可以进行覆盖(重写)具体实现类实现......
  • IDL根据Landsat QA波段去云处理【代码】
    IDL根据LandsatQA波段去云处理【代码】​landsatQA波段(质量评估波段)是Landsat卫星影像数据中的一个特殊波段,他在Landsat5-9的每个产品中都存在。虽然我们常用的Landsat影像数据有B1-B7波段,但QA波段并不是其中之一。它可以反映出云、云阴影、雪等类别的像素,常常应用在影像......
  • 用selenium打开网页的最小模板
    前言环境:win10python3.10selenium4.12经常用selenium来实现一个打开网页的这样一个小功能,虽然代码很少,但每次重0开始写就很烦。所以这里记录下一个模板小模板importtimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.web......
  • Smartforms在同一页中打印多份模板,打印动态表格
    要求:一:需要在一份A4纸中打印上下两个表格,每个表格行只有5行,不够的需要补齐,超出的需要打印到第二个表格中.二:表格不是固定的,需要根据某个字段,确定使用的表格格式 解决方法,我们只需要创建一个模板高度的数据模板,通过循环来打印我们的模板,相当于每次印半页,印两次就......
  • 在AWS Lightsail建立WordPress Multisite & Route 53 subdomains & Hexo Blog & WordP
    1.0前言玩Startup比賽,因需高效快速地做POC原型產品,所以利用AWS云端服務來更快地開發。你會學到:LightSail建立WordpressmultisiteRoute53註冊WordpressSubdomains&GithubCuostomDomainLightSailCustomDomain&SSLHexo快速搭建GihubPages博客+ Route53 Custom......
  • [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
    凸包,顾名思义,就是凸多边形包围,具体定义见OI-wiki(既是周长最小也是面积最小)有Graham算法和Andrew算法,后者精度更高常数更小(因为不涉及求角度)Andrew算法:1.将点排序(横坐标为第一关键字,纵坐标为第二关键字)2.从左到右维护上半部分,再从右到左维护下半部分。具体见OI-wiki。最后说的......